🏠 | 💻 IT | Linux | Bash |

Передать файл или пароль по 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
Bash Scripting
-eq -gt …: Операторы сравнения
if else: Условные операторы
Цикл while
date
Переход на новую строку
Арифметические операции
Errors Bash
Share in social media: