Я пытаюсь обойти ситуацию, когда мне нужно зайти на сервер , не имея возможности использовать ключи ssh. В результате я формулируя «который является плохой практикой» -expect сценарий:Откуда берутся?
#!/usr/bin/expect
set arg1 [lindex $argv 0]
spawn ssh $arg1 -l user "hostname; env x='() { :;}; echo vulnerable' bash -c \"echo this is a test\"; echo"
expect " password:"
send "my_supersecret_password\n"
interact
Бег это работает отлично:
$ ./ssh.expect server
spawn ssh server -l user hostname; env x='() { :;}; echo vulnerable' bash -c "echo this is a test"; echo
[email protected]'s password:
server
this is a test
$
Но мне нужно лучше форматированный список, когда работает на более чем одна система, поэтому я стараюсь, чтобы Perl переформатировать данные:
$ ./ssh.expect server | perl -e '$dump = <>; $dump = <>; chomp($line1 = <>); chomp($line2 = <>); $dump = <>; print "$line1:$line2\n";'
:this is a test
имя сервера печатается как, если он заканчивается \ г. Я не думаю, что так и должно быть. Вы согласны? Как я могу заставить систему не возвращаться к столбцу 0 после печати имени сервера?
Я могу подтвердить, что обе переменные содержат данные, путем добавления новой строки в моей печати:
$ ./ssh.expect server | perl -e '$dump = <>; $dump = <>; chomp($line1 = <>); chomp($line2 = <>); $dump = <>; print "$line1\n:$line2\n";'
server
:this is a test
EDIT:
Как отметил следующие работы.
./ssh.expect server | tr -d '\r' | perl -e '$dump = <>; $dump = <>; chomp($line1 = <>); chomp($line2 = <>); $dump = <>; print "$line1:$line2\n";'
server:this is a test
Не следует ли помнить tr trundundant?
Обычно это происходит из окон, связанных с окнами. до 'tr -d '\ r'' до вашей команды perl. – arco444
Как глупо, это работает как шарм! Я просмотрел вывод в vim, но в списке нет \ r, поэтому я даже не пытался его обрезать. – azzid
'\ r' is'^M' в vim, но vim достаточно умен, чтобы понимать файлы новой строки DOS и скрывать их (т. Е. Вы будете видеть их только в смешанных файлах окончания строки). –