I can have 50-60 users logged on via x2go. Sometimes I need to logout many users. I use the following utility to list and match x2go sessions.
Using the -r switch will run x2goterminate-session against the matched sessions.
Others may find this useful, so I post my script here.
Running the script without arguments will simply list all x2go sessions.
The -h switch will show usage.
I've attached the file but I suspect that will it be lost in the mailing list archives.
Since it's short I also cut and paste here:
------------------------------ cut ------------------------------ #!/usr/bin/perl # List (and terminate) x2go sessions use strict; use warnings; use v5.10; use Getopt::Std;
my %opts; getopts('hjqr', \%opts); my $help = defined $opts{h} ? $opts{h} : 0; my $printjob = defined $opts{j} ? $opts{j} : 0; my $quite = defined $opts{q} ? $opts{q} : 0; my $run = defined $opts{r} ? $opts{r} : 0;
my $x2goterminate = '/usr/bin/x2goterminate-session'; my $x2golistsessions = '/usr/sbin/x2golistsessions_root';
if ($help) { print STDERR <<EOT; Usage: $0 [-hjqr] [[pattern] .. pattern] Runs $x2golistsessions and outputs in a more readable format Only print x2go sessions that match the pattern[s] If no pattern is given, lists all x2go sessions -h This message -j print job command to terminate matched sessions, not session information -q quite, don't print anything -r Terminate the matched sessions with $x2goterminate EOT exit 1; }
# $x2golistsessions lists sessions like this: #456|user-122-1460160892_stDXFCE_dp32|122|host.com |R|2016-04-09T10:14:52|cba4aa51a29c4b7e2d529e6f628245eb|123.456.789.012|30259|30261|2016-04-09T10:14:56|user|1125|30262| # 0 1 2 3 4 5 6 7 8 9 10 11 12 13 # # These are the fields that we print (@pretty) and/or we match against my @pretty = (4,5,7,1); # # The sessionID field required for $x2goterminate my $sessionID = 1; # Results sorted by time my $sessionTime = 5;
# Generate the string we print and match against sub pretty { my $s = shift; return "" unless defined $s; # (ref to) array of session fields return sprintf "%s %s %-16s %s", @{$s}[@pretty]; }
# Get the session list and split the fields in each session my $sessions = qx( $x2golistsessions ); my @sessions = (); for my $s (split /\n/, $sessions) { push @sessions, [ split '\|', $s ]; }
# If no command line patterns, match all sessions unless (@ARGV) { @ARGV = ( '.' ); }
# patten match on the session information my %tokill; # sessions to kill/display for my $p (@ARGV) {
my @tokill = grep { grep /$p/, pretty($_) } @sessions;
# convert to hash to eliminate duplicates over multiple @ARGV
for my $s (@tokill) {
$tokill{$s->[$sessionID]} = $s;
}
}
# pretty = session information that patterns are matched against # job = command that would execute to terminate session
for my $s (sort {$a->[$sessionTime] cmp $b->[$sessionTime]} values %tokill) { my $pretty = pretty($s); my $job = sprintf "%s %s", $x2goterminate, $s->[$sessionID];
unless ($quite) {
say $printjob ? $job : $pretty;
}
system $job if $run;
}
-- Norman Gaywood, Computer Systems Officer School of Science and Technology University of New England Armidale NSW 2351, Australia
ngaywood@une.edu.au http://turing.une.edu.au/~ngaywood Phone: +61 (0)2 6773 2412 Mobile: +61 (0)4 7862 0062
Please avoid sending me Word or Power Point attachments. See http://www.gnu.org/philosophy/no-word-attachments.html