Передать файл или пароль по SFTP в Bash скрипте
Introduction
Подсоединиться по sftp в bash очень просто sftp user@domain.
Если у вас настроена авторизация по ключу то сразу появится sftp>
Если не настроена, то нужно вводить пароль.
Допустим, нужно передать файл, причём сделать это из скрипта, а не вводом команд с клавиатуры.
Новичка это задание может поставить в тупик, но если воспользоваться
expect
всё должно получиться.
Expect
expect это язык неидентичный
bash
, поэтому для него понадобится
отдельный скрипт
Будем вызывать этот скрипт из основного bash скрипта
#!/bin/bash
# Часть вашего bash скрипта до передачи по sftp
# Вызов скрипта на языке expect
./expect_sftp_script
# Часть вашего bash скрипта после по sftp
Теперь перейдём непосредственно к скрипту на языке expect
Обратите внимание на то, что первой строчкой должен быть
#!/usr/bin/env expect
а не #!/bin/bash
Именно поэтому нельзя совместить два скрипта в одном файле
#!/usr/bin/env expect
# подключимся к серверу
spawn sftp root@server
expect "sftp>"
# Можно начать передавать команды
send "lcd /opt/input"
# После каждой команды имитируем нажатие Enter
send \n
expect "sftp>"
send "cd /tmp"
send \n
expect "sftp>"
send "put $test_file_sftp"
send \n
expect "sftp>"
send "exit"
Передача аргументов
Из bash скрипта можно передать переменные в expect скрипт
Вызовем expect скрипт с одним аргументом
#!/bin/bash
# Часть вашего bash скрипта до передачи по sftp
# Вызов скрипта на языке expect
# В качестве первого аргумента передаём 1
./expect_sftp_script 1
# Часть вашего bash скрипта после по sftp
#!/usr/bin/env expect
set arg_from_bash [lindex $argv 0]
spawn sftp root@server
expect "sftp>"
send "lcd /opt/input"
send \n
expect "sftp>"
send "cd /tmp"
send \n
expect "sftp>"
send "put $arg_from_bash"
send \n
expect "sftp>"
# Закрываем соединение
send "exit"
Bash | |
Bash Scripting | |
-eq -gt …: Операторы сравнения | |
if else: Условные операторы | |
Цикл while | |
date | |
Переход на новую строку | |
Арифметические операции | |
Errors Bash |