parallel: Fixed: bug #66317: SSHLogin parsing fails.

This commit is contained in:
Ole Tange 2024-10-20 16:58:26 +02:00
parent 0a6ae96002
commit db33c11b05
5 changed files with 293 additions and 39 deletions

View file

@ -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 ':') {

View file

@ -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.

View file

@ -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]';}

View file

@ -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() {

View file

@ -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