#sftp #expect #spawn
#sftp #ожидать #порождение
Вопрос:
Я должен написать сценарий sftp-доступа с аутентификацией по паролю. К сожалению, наш клиент не может создать аутентификацию ключа на сервере, к которому мы должны получить доступ.
Все sftp-команды генерируются и записываются во временный файл (tmp.txt ). Следующая команда отлично работает в командной строке:
sftp OnlineRegTest_BS@ftp.b-n-c.ch < tmp.txt
Проблемы начинаются, когда я хотел бы использовать «ожидать», потому что я должен написать сценарий и использовать пароль.
EXPECTSCRIPT=`cat <<EOF
spawn sftp user@server < tmp.txt
expect "password"
send ${pass}
send "r"
EOF`
expect -c "$EXPECTSCRIPT"
Если я удалю «< tmp.txt «связь установится. Но мне нужны команды из tmp.txt . Вот сообщение об ошибке:
[root@xxx web]# ./transfer.sh
spawn sftp user@server < tmp.txt
usage: sftp [-1Cv] [-B buffer_size] [-b batchfile] [-F ssh_config]
[-o ssh_option] [-P sftp_server_path] [-R num_requests]
[-S program] [-s subsystem | sftp_server] host
sftp [[user@]host[:file [file]]]
sftp [[user@]host[:dir[/]]]
sftp -b batchfile [user@]host
send: spawn id exp6 not open
while executing
"send password"
У кого-нибудь есть какие-нибудь идеи?
Я также не смог запустить его с sftp -b … 🙁
редактировать для @glenn jackman
EXPECTSCRIPT2=`cat <<EOF
spawn sh -c {sftp user@server < tmp.txt}
expect "password"
send ${pass}
send "r"
expect "sftp>"
expect "sftp>"
.....
expect "sftp>"
expect "sftp>"
expect "sftp>"
EOF`
the tmp.txt выглядит примерно так:
cd d
put d/d1
cd ../e
put e/e1
put e/e2
cd ../f
put f/f1
Комментарии:
1.Вы путаете удаленную и локальную структуру каталогов? Вы меняете каталог на
d
на сервере, затем помещаете локальный файл./d/d1
на сервер. У вас есть локальный./d
каталог?2. на самом деле да.. структура локальных папок такая же, как и на целевом сервере. Для 3 языков — папка. (d, e и f) Та же структура находится на сервере, к которому я подключаюсь. Это требование от нашего разработчика.
3. Можете ли вы использовать SSH-ключи? Если да, вам вообще не нужно ожидать.
4. к сожалению, нет! в этом и проблема! 🙁 у нашего клиента, на котором стоит сервер, нет аутентификации по ключу. И не могу его настроить !! 🙁
Ответ №1:
Попробуйте создать оболочку для обработки перенаправления:
spawn sh -c {sftp user@example.com < tmp.txt}
Комментарии:
1. Спасибо. Теперь я на шаг дальше. Но он все еще работает не так, как должен. Подключение к sftp-серверу теперь в порядке. Но команды tmp.txt их не казнят. есть идеи по этому поводу? Если я добавлю много «ожидаемых» sftp>» в expectscript, это сработает.. но на самом деле это не цель. Подробности в редактировании выше.. (в вопросе)