2015-09-08 2 views
-1

Я действительно мог бы помочь. Я все еще довольно новичок. Мне нужно запустить команду scp непосредственно после запуска sftp.ожидать: запуск scp после sftp

У меня есть первая часть этого скрипта, моя основная проблема - нижняя часть. Мне действительно нужно запустить команду после завершения этой команды. Я предпочел бы создать другую команду, кроме как взломать что-то вроде того, как это сделать с помощью команды sleep и запустить ее через 10 секунд или что-то странное.

Любые предложения приветствуются!

spawn sftp [email protected] 
expect "password: " 
send "123\r" 
expect "$ " 
sleep 2 
send "cd mydir\r" 
expect "$ " 
sleep 2 
send "get somefile\r" 
expect "$ " 
sleep 2 
send "bye\r" 
expect "$ " 
sleep 2 

spawn scp somefile [email protected]:/home/user2/ 
sleep 2 

Так я понял, что я могу на самом деле получить это запустить подпроцесс, если я использую «Exec» вместо икры .. другими словами:

exec scp somefile [email protected]:/home/user2/ 

единственная проблема? Он подсказывает мне пароль! Этого не должно быть, у меня уже есть ssh-ключи, установленные на обеих системах. (Другими словами, если я запустил команду scp с хоста, я запускаю этот сценарий ожидания, он будет работать без запроса пароля). Система, к которой я пытаюсь выполнить scp, должна распознавать этот недавно возникший процесс как новый хост, потому что он не собирает мой ssh-ключ. Есть идеи?

BTW, я извиняюсь, что на самом деле я не опубликовал «рабочий» сценарий, но я не могу этого сделать без обеспечения безопасности этого сервера. Надеюсь, это не умаляет возможности помочь мне.

Я думаю, что проблема заключается в том, что я не прекращаю первоначальный процесс. Я не понимаю, что этого достаточно, чтобы сделать это правильно. Если я попытаюсь «закрыть» или «eof», он просто уничтожит весь скрипт, который я пока не хочу делать (потому что мне все еще нужно скопировать файл на второй хост).

+0

Вы отправляете команды в sftp, тогда вы хотите выполнить команду scp и снова хотите отправить команды в sftp? – Dinesh

+0

Dinesh, я пытаюсь захватить файл из host-a через sftp и поместить его на host-b через scp. Нам предоставляется только доступ к host-a через sftp, поэтому использование scp на host-a (или любой другой метод) не является вариантом. – slugman

+0

Возможно, вы захотите использовать (по сути, скриптовый) клиент, такой как lftp, который может говорить оба протокола. Не нужно писать два разных клиента. –

ответ

2

Убедитесь, что ваш секретный ключ SSH загружен в агент и что переменные среды, указывающие на этот агент, активны в сеансе, где вы вызываете scp.

[[ $SSH_AUTH_SOCK ]] || {  # if no agent already running... 
    eval "$(ssh-agent -s)"  # ...then start one... 
    ssh-add /path/to/your/ssh/key # ...load your key... 
    started_ssh_agent=1   # and flag that we started it ourselves 
} 

# ...put your script here... 

[[ $started_ssh_agent ]] && { # if we started the agent ourselves... 
    eval "$(ssh-agent -s -k)"  # ...then clean up nicely when done. 
} 

Как и в сторону, я бы сильно предлагает заменить код, приведенный в вопросе с чем-то вроде следующего:

lftp -u user,123 -e 'get /mydir/somefile -o localfile' sftp://host </dev/null 
lftp scp://[email protected] -e 'put localfile -o /home/user2/somefile' </dev/null 

Каждое соединение обрабатывается в одной строке, и нет глупость возится с expect.

+0

Чарльз, это намного проще, чем я пытался сделать. Теперь я могу использовать это в своем основном скрипте и фактически вызывать локальные переменные без $: :(env). Я бы хотел узнать tcl когда-нибудь, но сейчас не время. Я могу работать с этим, я отчитаю решение. – slugman

+0

Чарльз, я должен был проиграть в ожидании, чтобы понять, насколько простым может быть lftp. Кроме того, он быстрее! Я изменил свой мастер-скрипт, чтобы использовать lftp вместо ожидания. Этот сценарий ожиданий был запущен как подпроцесс, так что теперь я могу остановить его с помощью одной линии lftp. Спасибо :) – slugman

+0

@slugman, рад помочь. Кстати, я не совсем делал все вокруг закрытия агента; см. правки. –

Смежные вопросы