2017-01-05 4 views
0

В настоящее время я запускаю этот скрипт для печати каталогов на удаленном ящике, но я не уверен, что этот код работает.Как написать фрагмент ожидания в скрипте bash для запуска удаленной команды?

#!/bin/bash 

PWD="test123" 
ip="10.9.8.38" 
user=$1 
/usr/bin/expect <<EOD 
spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no [email protected]$ip df -h 
expect "*assword:" 
send "$PWD\n" 
interact 
EOD 
+0

Надеюсь, это поможет: http://www.thegeekstuff.com/2010/10/expect-examples/ – OscarAkaElvis

ответ

2

expect порождает новый подоболочку, следовательно, ваши местные bash переменные теряют объем, один из способов достижения этой цели является export ваших переменных, чтобы сделать его доступным для суб-оболочки. Используйте встроенный файл Tcl env для импорта таких переменных в ваш скрипт.

#!/bin/bash 

export pwdir="test123" 
export ip="10.9.8.38" 
export user=$1 
/usr/bin/expect <<EOD 
spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no "$env(user)"@"$env(ip)" df -h 
expect "*assword:" 
send "$env(pwdir)\n" 
interact 
EOD 

(или) Если вы не заинтересованы в использовании expect сценария непосредственно с #!/usr/bin/expect она-бэнгом, вы можете сделать что-то вроде

#!/usr/bin/expect 

set pwdir [lindex $argv 0]; 
set ip [lindex $argv 1]; 
set user [lindex $argv 2]; 
spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no [email protected]$ip df -h 
expect "*assword:" 
send "$pwdir\n" 
interact 

и запустить скрипт как

./script.exp "test123" "10.9.8.38" "johndoe" 
+0

Спасибо за предложение в моем скрипте. Я добавил sleep 2 после отправки «$ PWD \ n», и он сработал. Теперь он приносит результат, но я не могу его использовать или использовать в своем локальном поле. –

+0

@sandy_ws: Если это решение сработало, вы можете перенести/принять его и пометить его. Вы можете поднять свой вопрос в другом сообщении (или), чтобы дать более подробную информацию о том, что не работает – Inian