From db33c11b05905852e8e245368fe1498f60196501 Mon Sep 17 00:00:00 2001 From: Ole Tange Date: Sun, 20 Oct 2024 16:58:26 +0200 Subject: [PATCH] parallel: Fixed: bug #66317: SSHLogin parsing fails. --- src/parallel | 126 ++++++++++++++--- src/parallel.pod | 4 +- testsuite/tests-to-run/parallel-local-30s.sh | 37 +++++ .../tests-to-run/parallel-local-race02.sh | 36 +++-- testsuite/wanted-results/parallel-local-30s | 129 ++++++++++++++++++ 5 files changed, 293 insertions(+), 39 deletions(-) diff --git a/src/parallel b/src/parallel index 19ef25ed..647ad449 100755 --- a/src/parallel +++ b/src/parallel @@ -2888,7 +2888,7 @@ sub check_invalid_option_combinations() { sub init_globals() { # Defaults: - $Global::version = 20240922; + $Global::version = 20241017; $Global::progname = 'parallel'; $::name = "GNU Parallel"; $Global::infinity = 2**31; @@ -7376,26 +7376,90 @@ sub new($$) { my $local; my $string; # SSHLogins can have these formats: - # @grp+grp/ncpu//usr/bin/ssh user@server - # ncpu//usr/bin/ssh user@server - # /usr/bin/ssh user@server - # user@server - # ncpu/user@server - # @grp+grp/user@server - # above with: user:password@server - # above with: user@server:port - # So: - # [@grp+grp][ncpu/][ssh command ][[user][:password]@][server[:port]] + # @grp1+grp2/ => use only servers in @grp1+grp2 + # [@grp+grp/][ncpu/][ssh command ][[user][:password]@][host[:port]] + # + # Here most combinations are generated: + # grp=grp1+grp2 + # ncpu=4 + # ssh=/usr/bin/ssh + # user=user + # pass=pass + # host=host + # port=port + # parallel -k echo {1}{2}{3}{4}{5}{=1'$_ = ($arg[4]||$arg[5]) ? "\@" : ""' =}$host{6} ::: '' @$grp/ ::: '' $ncpu/ ::: '' $ssh' ' ::: '' $user ::: '' :$pass ::: '' :$port + # host + # host:port + # :pass@host + # :pass@host:port + # user@host + # user@host:port + # user:pass@host + # user:pass@host:port + # /usr/bin/ssh host + # /usr/bin/ssh host:port + # /usr/bin/ssh :pass@host + # /usr/bin/ssh :pass@host:port + # /usr/bin/ssh user@host + # /usr/bin/ssh user@host:port + # /usr/bin/ssh user:pass@host + # /usr/bin/ssh user:pass@host:port + # ncpu/host + # ncpu/host:port + # ncpu/:pass@host + # ncpu/:pass@host:port + # ncpu/user@host + # ncpu/user@host:port + # ncpu/user:pass@host + # ncpu/user:pass@host:port + # ncpu//usr/bin/ssh host + # ncpu//usr/bin/ssh host:port + # ncpu//usr/bin/ssh :pass@host + # ncpu//usr/bin/ssh :pass@host:port + # ncpu//usr/bin/ssh user@host + # ncpu//usr/bin/ssh user@host:port + # ncpu//usr/bin/ssh user:pass@host + # ncpu//usr/bin/ssh user:pass@host:port + # @grp1+grp2/host + # @grp1+grp2/host:port + # @grp1+grp2/:pass@host + # @grp1+grp2/:pass@host:port + # @grp1+grp2/user@host + # @grp1+grp2/user@host:port + # @grp1+grp2/user:pass@host + # @grp1+grp2/user:pass@host:port + # @grp1+grp2//usr/bin/ssh host + # @grp1+grp2//usr/bin/ssh host:port + # @grp1+grp2//usr/bin/ssh :pass@host + # @grp1+grp2//usr/bin/ssh :pass@host:port + # @grp1+grp2//usr/bin/ssh user@host + # @grp1+grp2//usr/bin/ssh user@host:port + # @grp1+grp2//usr/bin/ssh user:pass@host + # @grp1+grp2//usr/bin/ssh user:pass@host:port + # @grp1+grp2/ncpu/host + # @grp1+grp2/ncpu/host:port + # @grp1+grp2/ncpu/:pass@host + # @grp1+grp2/ncpu/:pass@host:port + # @grp1+grp2/ncpu/user@host + # @grp1+grp2/ncpu/user@host:port + # @grp1+grp2/ncpu/user:pass@host + # @grp1+grp2/ncpu/user:pass@host:port + # @grp1+grp2/ncpu//usr/bin/ssh host + # @grp1+grp2/ncpu//usr/bin/ssh host:port + # @grp1+grp2/ncpu//usr/bin/ssh :pass@host + # @grp1+grp2/ncpu//usr/bin/ssh :pass@host:port + # @grp1+grp2/ncpu//usr/bin/ssh user@host + # @grp1+grp2/ncpu//usr/bin/ssh user@host:port + # @grp1+grp2/ncpu//usr/bin/ssh user:pass@host + # @grp1+grp2/ncpu//usr/bin/ssh user:pass@host:port - # [@grp+grp]/ncpu//usr/bin/ssh user:pass@server:port - if($s =~ s:^\@([^/]+)/?::) { + # [@grp+grp/][ncpu/][ssh command ][[user][:password]@][host[:port]] + if($s =~ s:^\@([^/]+)/::) { # Look for SSHLogin hostgroups %hostgroups = map { $_ => 1 } split(/\+|,/, $1); } - # An SSHLogin is always in the hostgroup of its "numcpu/host" - $hostgroups{$s} = 1; - # [ncpu/]/usr/bin/ssh user:pass@server:port + # [ncpu/][ssh command ][[user][:password]@][host[:port]] if ($s =~ s:^(\d+)/::) { $ncpus = $1; } # Why disallow space in password? @@ -7407,11 +7471,13 @@ sub new($$) { # cmd 'C:/bin/ssh' user 'user' with password 'C:/bin/ssh' # This is impossible to determine. # With space forbidden in password it uniquely parses as the 2nd. - # [/usr/bin/ssh ]user:pass@server:port + # [ssh command ][[user][:password]@][host[:port]] if($s =~ s/^(.*) //) { $sshcommand = $1; } - # [user:pass@]server:port - if($s =~ s/^(.+)@//) { + # [[user][:password]@][host[:port]] + # An SSHLogin is always in the hostgroup of its "user:pass@host:port" + $hostgroups{$s} = 1; + if($s =~ s/^(.*)@//) { my $userpw = $1; # user[:pass] if($userpw =~ s/:(.*)//) { @@ -7422,9 +7488,25 @@ sub new($$) { ::wait_and_exit(255); } } + # This might be empty - that is OK $user = $userpw; } - # [server]:port + # [host[:port]] + # host can have these formats: + # hostname (: as local is dealt with later) + # IPv4 i.p.n.o + # with port + # * :22 + # * :ssh + # IPv6: + # * \[b11010000011101] + # * \[o64072/14] + # * \[xd074/14] + # * \[208.116.0.0/14] + # with port + # * .22 + # * p22 + # * #22 if(not $s =~ /:.*:/ and $s =~ s/^([-a-z0-9._]+)//i) { @@ -7446,7 +7528,6 @@ sub new($$) { # 2001:db8::1 port 80 - not supported $host = $1; } - # [:port] if($s =~ s/^:(\w+)//i) { $port = $1; @@ -7468,10 +7549,11 @@ sub new($$) { ($user && $user."@"). ($host && $host). ($port && ":$port"); + my $userpassword = ($user && $user).($password && ":".$password); my $pwstring = # Only include the sshcommand in $string if it is set by user ($sshcommand && $sshcommand." "). - ($user && $user. ($password && ":".$password)."@"). + ($userpassword && $userpassword."@"). ($host && $host). ($port && ":$port"); if($host eq ':') { diff --git a/src/parallel.pod b/src/parallel.pod index d9cf18aa..cf92c08d 100644 --- a/src/parallel.pod +++ b/src/parallel.pod @@ -3190,11 +3190,11 @@ See also: TIME POSTFIXES B<--sshlogin> B<--delay> =item B<--sshlogin> I<[@hostgroups/][ncpus/][[user][:[password]]@]host[:port][,...]> -=item B<--sshlogin> I<@hostgroup> +=item B<--sshlogin> I<@hostgroup>/ =item B<-S> I<[@hostgroups/][ncpus/][ssh command][[user][:[password]]@]host[:port][,...]> -=item B<-S> I<@hostgroup> +=item B<-S> I<@hostgroup>/ Distribute jobs to remote computers. diff --git a/testsuite/tests-to-run/parallel-local-30s.sh b/testsuite/tests-to-run/parallel-local-30s.sh index 860a017c..f05600cd 100755 --- a/testsuite/tests-to-run/parallel-local-30s.sh +++ b/testsuite/tests-to-run/parallel-local-30s.sh @@ -8,6 +8,43 @@ # Each should be taking 30-100s and be possible to run in parallel # I.e.: No race conditions, no logins +par_sshlogin_parsing() { + echo '### Generate sshlogins to test parsing' + sudo sshd -p 22222 + + gen_sshlogin() { + grp=grp1+grp2 + ncpu=4 + ssh=/usr/bin/ssh + user=parallel + userpass=withpassword + pass="$withpassword" + host=lo + port=22222 + # no pass + parallel -k echo \ + {1}{2}{3}{4}{5}{=1'$_ = ($arg[4]||$arg[5]) ? "\@" : ""' =}$host{6} \ + ::: '' @$grp/ ::: '' $ncpu/ ::: '' $ssh' ' \ + ::: '' $user ::: '' ::: '' :$port + # pass + parallel -k echo \ + {1}{2}{3}{4}{5}{=1'$_ = ($arg[4]||$arg[5]) ? "\@" : ""' =}$host{6} \ + ::: '' @$grp/ ::: '' $ncpu/ ::: '' $ssh' ' \ + ::: '' $userpass ::: :"$pass" ::: '' :$port + } + + doit() { + if parallel -S "$1" {} '$SSH_CLIENT|field 3;whoami' ::: echo ; then + : echo OK + else + echo Fail + fi + } + export -f doit + + gen_sshlogin | parallel --tag --timeout 20 -k doit +} + par__print_in_blocks() { echo '### bug #41565: Print happens in blocks - not after each job complete' median() { perl -e '@a=sort {$a<=>$b} <>;print $a[$#a/2]';} diff --git a/testsuite/tests-to-run/parallel-local-race02.sh b/testsuite/tests-to-run/parallel-local-race02.sh index af551b28..79cecc40 100755 --- a/testsuite/tests-to-run/parallel-local-race02.sh +++ b/testsuite/tests-to-run/parallel-local-race02.sh @@ -99,18 +99,21 @@ par_sql_CSV() { } par_hostgroup() { - echo '### --hostgroup force ncpu' - parallel --delay 0.1 --hgrp -S @g1/1/parallel@lo -S @g2/3/lo whoami\;sleep 0.4{} ::: {1..8} | sort -u + echo '### --hostgroup force ncpu - 2x parallel, 6x me' + parallel --delay 0.1 --hgrp -S @g1/1/parallel@lo -S @g2/3/lo \ + 'whoami;sleep 0.4{}' ::: {1..8} | sort - echo '### --hostgroup two group arg' - parallel -k --sshdelay 0.1 --hgrp -S @g1/1/parallel@lo -S @g2/3/lo whoami\;sleep 0.3{} ::: {1..8}@g1+g2 | sort + echo '### --hostgroup two group arg - 2x parallel, 6x me' + parallel -k --sshdelay 0.1 --hgrp -S @g1/1/parallel@lo -S @g2/3/lo \ + 'whoami;sleep 0.3{}' ::: {1..8}@g1+g2 | sort - echo '### --hostgroup one group arg' - parallel --delay 0.2 --hgrp -S @g1/1/parallel@lo -S @g2/3/lo whoami\;sleep 0.4{} ::: {1..8}@g2 + echo '### --hostgroup one group arg - 8x me' + parallel --delay 0.2 --hgrp -S @g1/1/parallel@lo -S @g2/3/lo \ + 'whoami;sleep 0.4{}' ::: {1..8}@g2 - echo '### --hostgroup multiple group arg + unused group' - parallel --delay 0.2 --hgrp -S @g1/1/parallel@lo -S @g1/3/lo -S @g3/100/tcsh@lo whoami\;sleep 0.8{} ::: {1..8}@g1+g2 2>&1 | - sort -u | grep -v Warning + echo '### --hostgroup multiple group arg + unused group - 2x parallel, 6x me, 0x tcsh' + parallel --delay 0.2 --hgrp -S @g1/1/parallel@lo -S @g1/3/lo -S @g3/30/tcsh@lo \ + 'whoami;sleep 0.8{}' ::: {1..8}@g1+g2 2>&1 | sort -u | grep -v Warning echo '### --hostgroup two groups @' parallel -k --hgrp -S @g1/parallel@lo -S @g2/lo --tag whoami\;echo ::: parallel@g1 tange@g2 @@ -121,14 +124,17 @@ par_hostgroup() { echo '### --hostgroup --sshlogin with @' parallel -k --hostgroups -S parallel@lo echo ::: no_group implicit_group@parallel@lo - echo '### --hostgroup -S @group' - parallel -S @g1/ -S @g1/1/tcsh@lo -S @g1/1/localhost -S @g2/1/parallel@lo whoami\;true ::: {1..6} | sort -u + echo '### --hostgroup -S @group - bad if you get parallel@lo' + parallel -S @g1/ -S @g1/1/tcsh@lo -S @g1/1/localhost -S @g2/1/parallel@lo \ + 'whoami;true' ::: {1..6} | sort -u - echo '### --hostgroup -S @group1 -Sgrp2' - parallel -S @g1/ -S @g2 -S @g1/1/tcsh@lo -S @g1/1/localhost -S @g2/1/parallel@lo whoami\;true ::: {1..6} | sort + echo '### --hostgroup -S @group1 -Sgrp2 - get all twice' + parallel -S @g1/ -S @g2/ -S @g1/1/tcsh@lo -S @g1/1/localhost -S @g2/1/parallel@lo \ + 'whoami;sleep 1;true' ::: {1..6} | sort - echo '### --hostgroup -S @group1+grp2' - parallel -S @g1+g2 -S @g1/1/tcsh@lo -S @g1/1/localhost -S @g2/1/parallel@lo whoami\;true ::: {1..6} | sort + echo '### --hostgroup -S @group1+grp2 - get all twice' + parallel -S @g1+g2/ -S @g1/1/tcsh@lo -S @g1/1/localhost -S @g2/1/parallel@lo \ + 'whoami;sleep 1;true' ::: {1..6} | sort } par_PARALLEL_RSYNC_OPTS() { diff --git a/testsuite/wanted-results/parallel-local-30s b/testsuite/wanted-results/parallel-local-30s index c9c03495..d526eb60 100644 --- a/testsuite/wanted-results/parallel-local-30s +++ b/testsuite/wanted-results/parallel-local-30s @@ -3058,6 +3058,135 @@ par_slow_total_jobs b par_slow_total_jobs 1 par_slow_total_jobs 2 par_slow_total_jobs parallel: Warning: Reading X arguments took longer than XX seconds. +par_sshlogin_parsing ### Generate sshlogins to test parsing +par_sshlogin_parsing lo 22 +par_sshlogin_parsing lo tange +par_sshlogin_parsing lo:22222 22222 +par_sshlogin_parsing lo:22222 tange +par_sshlogin_parsing parallel@lo 22 +par_sshlogin_parsing parallel@lo parallel +par_sshlogin_parsing parallel@lo:22222 22222 +par_sshlogin_parsing parallel@lo:22222 parallel +par_sshlogin_parsing /usr/bin/ssh lo 22 +par_sshlogin_parsing /usr/bin/ssh lo tange +par_sshlogin_parsing /usr/bin/ssh lo:22222 22222 +par_sshlogin_parsing /usr/bin/ssh lo:22222 tange +par_sshlogin_parsing /usr/bin/ssh parallel@lo 22 +par_sshlogin_parsing /usr/bin/ssh parallel@lo parallel +par_sshlogin_parsing /usr/bin/ssh parallel@lo:22222 22222 +par_sshlogin_parsing /usr/bin/ssh parallel@lo:22222 parallel +par_sshlogin_parsing 4/lo 22 +par_sshlogin_parsing 4/lo tange +par_sshlogin_parsing 4/lo:22222 22222 +par_sshlogin_parsing 4/lo:22222 tange +par_sshlogin_parsing 4/parallel@lo 22 +par_sshlogin_parsing 4/parallel@lo parallel +par_sshlogin_parsing 4/parallel@lo:22222 22222 +par_sshlogin_parsing 4/parallel@lo:22222 parallel +par_sshlogin_parsing 4//usr/bin/ssh lo 22 +par_sshlogin_parsing 4//usr/bin/ssh lo tange +par_sshlogin_parsing 4//usr/bin/ssh lo:22222 22222 +par_sshlogin_parsing 4//usr/bin/ssh lo:22222 tange +par_sshlogin_parsing 4//usr/bin/ssh parallel@lo 22 +par_sshlogin_parsing 4//usr/bin/ssh parallel@lo parallel +par_sshlogin_parsing 4//usr/bin/ssh parallel@lo:22222 22222 +par_sshlogin_parsing 4//usr/bin/ssh parallel@lo:22222 parallel +par_sshlogin_parsing @grp1+grp2/lo 22 +par_sshlogin_parsing @grp1+grp2/lo tange +par_sshlogin_parsing @grp1+grp2/lo:22222 22222 +par_sshlogin_parsing @grp1+grp2/lo:22222 tange +par_sshlogin_parsing @grp1+grp2/parallel@lo 22 +par_sshlogin_parsing @grp1+grp2/parallel@lo parallel +par_sshlogin_parsing @grp1+grp2/parallel@lo:22222 22222 +par_sshlogin_parsing @grp1+grp2/parallel@lo:22222 parallel +par_sshlogin_parsing @grp1+grp2//usr/bin/ssh lo 22 +par_sshlogin_parsing @grp1+grp2//usr/bin/ssh lo tange +par_sshlogin_parsing @grp1+grp2//usr/bin/ssh lo:22222 22222 +par_sshlogin_parsing @grp1+grp2//usr/bin/ssh lo:22222 tange +par_sshlogin_parsing @grp1+grp2//usr/bin/ssh parallel@lo 22 +par_sshlogin_parsing @grp1+grp2//usr/bin/ssh parallel@lo parallel +par_sshlogin_parsing @grp1+grp2//usr/bin/ssh parallel@lo:22222 22222 +par_sshlogin_parsing @grp1+grp2//usr/bin/ssh parallel@lo:22222 parallel +par_sshlogin_parsing @grp1+grp2/4/lo 22 +par_sshlogin_parsing @grp1+grp2/4/lo tange +par_sshlogin_parsing @grp1+grp2/4/lo:22222 22222 +par_sshlogin_parsing @grp1+grp2/4/lo:22222 tange +par_sshlogin_parsing @grp1+grp2/4/parallel@lo 22 +par_sshlogin_parsing @grp1+grp2/4/parallel@lo parallel +par_sshlogin_parsing @grp1+grp2/4/parallel@lo:22222 22222 +par_sshlogin_parsing @grp1+grp2/4/parallel@lo:22222 parallel +par_sshlogin_parsing @grp1+grp2/4//usr/bin/ssh lo 22 +par_sshlogin_parsing @grp1+grp2/4//usr/bin/ssh lo tange +par_sshlogin_parsing @grp1+grp2/4//usr/bin/ssh lo:22222 22222 +par_sshlogin_parsing @grp1+grp2/4//usr/bin/ssh lo:22222 tange +par_sshlogin_parsing @grp1+grp2/4//usr/bin/ssh parallel@lo 22 +par_sshlogin_parsing @grp1+grp2/4//usr/bin/ssh parallel@lo parallel +par_sshlogin_parsing @grp1+grp2/4//usr/bin/ssh parallel@lo:22222 22222 +par_sshlogin_parsing @grp1+grp2/4//usr/bin/ssh parallel@lo:22222 parallel +par_sshlogin_parsing ::;`echo>/tmp/trap`;)(|<*&"'@lo 22 +par_sshlogin_parsing ::;`echo>/tmp/trap`;)(|<*&"'@lo tange +par_sshlogin_parsing ::;`echo>/tmp/trap`;)(|<*&"'@lo:22222 22222 +par_sshlogin_parsing ::;`echo>/tmp/trap`;)(|<*&"'@lo:22222 tange +par_sshlogin_parsing withpassword::;`echo>/tmp/trap`;)(|<*&"'@lo 22 +par_sshlogin_parsing withpassword::;`echo>/tmp/trap`;)(|<*&"'@lo withpassword +par_sshlogin_parsing withpassword::;`echo>/tmp/trap`;)(|<*&"'@lo:22222 22222 +par_sshlogin_parsing withpassword::;`echo>/tmp/trap`;)(|<*&"'@lo:22222 withpassword +par_sshlogin_parsing /usr/bin/ssh ::;`echo>/tmp/trap`;)(|<*&"'@lo 22 +par_sshlogin_parsing /usr/bin/ssh ::;`echo>/tmp/trap`;)(|<*&"'@lo tange +par_sshlogin_parsing /usr/bin/ssh ::;`echo>/tmp/trap`;)(|<*&"'@lo:22222 22222 +par_sshlogin_parsing /usr/bin/ssh ::;`echo>/tmp/trap`;)(|<*&"'@lo:22222 tange +par_sshlogin_parsing /usr/bin/ssh withpassword::;`echo>/tmp/trap`;)(|<*&"'@lo 22 +par_sshlogin_parsing /usr/bin/ssh withpassword::;`echo>/tmp/trap`;)(|<*&"'@lo withpassword +par_sshlogin_parsing /usr/bin/ssh withpassword::;`echo>/tmp/trap`;)(|<*&"'@lo:22222 22222 +par_sshlogin_parsing /usr/bin/ssh withpassword::;`echo>/tmp/trap`;)(|<*&"'@lo:22222 withpassword +par_sshlogin_parsing 4/::;`echo>/tmp/trap`;)(|<*&"'@lo 22 +par_sshlogin_parsing 4/::;`echo>/tmp/trap`;)(|<*&"'@lo tange +par_sshlogin_parsing 4/::;`echo>/tmp/trap`;)(|<*&"'@lo:22222 22222 +par_sshlogin_parsing 4/::;`echo>/tmp/trap`;)(|<*&"'@lo:22222 tange +par_sshlogin_parsing 4/withpassword::;`echo>/tmp/trap`;)(|<*&"'@lo 22 +par_sshlogin_parsing 4/withpassword::;`echo>/tmp/trap`;)(|<*&"'@lo withpassword +par_sshlogin_parsing 4/withpassword::;`echo>/tmp/trap`;)(|<*&"'@lo:22222 22222 +par_sshlogin_parsing 4/withpassword::;`echo>/tmp/trap`;)(|<*&"'@lo:22222 withpassword +par_sshlogin_parsing 4//usr/bin/ssh ::;`echo>/tmp/trap`;)(|<*&"'@lo 22 +par_sshlogin_parsing 4//usr/bin/ssh ::;`echo>/tmp/trap`;)(|<*&"'@lo tange +par_sshlogin_parsing 4//usr/bin/ssh ::;`echo>/tmp/trap`;)(|<*&"'@lo:22222 22222 +par_sshlogin_parsing 4//usr/bin/ssh ::;`echo>/tmp/trap`;)(|<*&"'@lo:22222 tange +par_sshlogin_parsing 4//usr/bin/ssh withpassword::;`echo>/tmp/trap`;)(|<*&"'@lo 22 +par_sshlogin_parsing 4//usr/bin/ssh withpassword::;`echo>/tmp/trap`;)(|<*&"'@lo withpassword +par_sshlogin_parsing 4//usr/bin/ssh withpassword::;`echo>/tmp/trap`;)(|<*&"'@lo:22222 22222 +par_sshlogin_parsing 4//usr/bin/ssh withpassword::;`echo>/tmp/trap`;)(|<*&"'@lo:22222 withpassword +par_sshlogin_parsing @grp1+grp2/::;`echo>/tmp/trap`;)(|<*&"'@lo 22 +par_sshlogin_parsing @grp1+grp2/::;`echo>/tmp/trap`;)(|<*&"'@lo tange +par_sshlogin_parsing @grp1+grp2/::;`echo>/tmp/trap`;)(|<*&"'@lo:22222 22222 +par_sshlogin_parsing @grp1+grp2/::;`echo>/tmp/trap`;)(|<*&"'@lo:22222 tange +par_sshlogin_parsing @grp1+grp2/withpassword::;`echo>/tmp/trap`;)(|<*&"'@lo 22 +par_sshlogin_parsing @grp1+grp2/withpassword::;`echo>/tmp/trap`;)(|<*&"'@lo withpassword +par_sshlogin_parsing @grp1+grp2/withpassword::;`echo>/tmp/trap`;)(|<*&"'@lo:22222 22222 +par_sshlogin_parsing @grp1+grp2/withpassword::;`echo>/tmp/trap`;)(|<*&"'@lo:22222 withpassword +par_sshlogin_parsing @grp1+grp2//usr/bin/ssh ::;`echo>/tmp/trap`;)(|<*&"'@lo 22 +par_sshlogin_parsing @grp1+grp2//usr/bin/ssh ::;`echo>/tmp/trap`;)(|<*&"'@lo tange +par_sshlogin_parsing @grp1+grp2//usr/bin/ssh ::;`echo>/tmp/trap`;)(|<*&"'@lo:22222 22222 +par_sshlogin_parsing @grp1+grp2//usr/bin/ssh ::;`echo>/tmp/trap`;)(|<*&"'@lo:22222 tange +par_sshlogin_parsing @grp1+grp2//usr/bin/ssh withpassword::;`echo>/tmp/trap`;)(|<*&"'@lo 22 +par_sshlogin_parsing @grp1+grp2//usr/bin/ssh withpassword::;`echo>/tmp/trap`;)(|<*&"'@lo withpassword +par_sshlogin_parsing @grp1+grp2//usr/bin/ssh withpassword::;`echo>/tmp/trap`;)(|<*&"'@lo:22222 22222 +par_sshlogin_parsing @grp1+grp2//usr/bin/ssh withpassword::;`echo>/tmp/trap`;)(|<*&"'@lo:22222 withpassword +par_sshlogin_parsing @grp1+grp2/4/::;`echo>/tmp/trap`;)(|<*&"'@lo 22 +par_sshlogin_parsing @grp1+grp2/4/::;`echo>/tmp/trap`;)(|<*&"'@lo tange +par_sshlogin_parsing @grp1+grp2/4/::;`echo>/tmp/trap`;)(|<*&"'@lo:22222 22222 +par_sshlogin_parsing @grp1+grp2/4/::;`echo>/tmp/trap`;)(|<*&"'@lo:22222 tange +par_sshlogin_parsing @grp1+grp2/4/withpassword::;`echo>/tmp/trap`;)(|<*&"'@lo 22 +par_sshlogin_parsing @grp1+grp2/4/withpassword::;`echo>/tmp/trap`;)(|<*&"'@lo withpassword +par_sshlogin_parsing @grp1+grp2/4/withpassword::;`echo>/tmp/trap`;)(|<*&"'@lo:22222 22222 +par_sshlogin_parsing @grp1+grp2/4/withpassword::;`echo>/tmp/trap`;)(|<*&"'@lo:22222 withpassword +par_sshlogin_parsing @grp1+grp2/4//usr/bin/ssh ::;`echo>/tmp/trap`;)(|<*&"'@lo 22 +par_sshlogin_parsing @grp1+grp2/4//usr/bin/ssh ::;`echo>/tmp/trap`;)(|<*&"'@lo tange +par_sshlogin_parsing @grp1+grp2/4//usr/bin/ssh ::;`echo>/tmp/trap`;)(|<*&"'@lo:22222 22222 +par_sshlogin_parsing @grp1+grp2/4//usr/bin/ssh ::;`echo>/tmp/trap`;)(|<*&"'@lo:22222 tange +par_sshlogin_parsing @grp1+grp2/4//usr/bin/ssh withpassword::;`echo>/tmp/trap`;)(|<*&"'@lo 22 +par_sshlogin_parsing @grp1+grp2/4//usr/bin/ssh withpassword::;`echo>/tmp/trap`;)(|<*&"'@lo withpassword +par_sshlogin_parsing @grp1+grp2/4//usr/bin/ssh withpassword::;`echo>/tmp/trap`;)(|<*&"'@lo:22222 22222 +par_sshlogin_parsing @grp1+grp2/4//usr/bin/ssh withpassword::;`echo>/tmp/trap`;)(|<*&"'@lo:22222 withpassword par_test_detected_shell ### bug #42913: Dont use $SHELL but the shell currently running par_test_detected_shell test_unknown_shell bash Global::shell /usr/bin/bash par_test_detected_shell test_unknown_shell csh Global::shell /usr/bin/bash