Как запустить команду sftp с паролем из скрипта Bash?

173

Мне нужно перенести файл журнала на удаленный хост, используя sftp с хоста Linux. Мне предоставили учетные данные для того же от моей операционной группы. Однако, поскольку у меня нет контроля над другим хостом, я не могу генерировать и делиться ключами RSA с другим хостом.

Так есть ли способ запустить sftpкоманду (с указанием имени пользователя и пароля) из скрипта Bash через задание cron ?

Я нашел похожий вопрос переполнения стека: Укажите пароль для sftp в скрипте Bash , но удовлетворительного ответа на мою проблему не было.

анубхава
источник

Ответы:

178

У вас есть несколько вариантов, кроме использования аутентификации с открытым ключом:

  1. Используйте брелок
  2. Используйте sshpass (менее безопасный, но, вероятно, соответствующий вашим требованиям)
  3. Используйте ожидаемый (наименее защищенный и требуется больше кодирования)

Если вы решили дать sshpass шанс, вот рабочий фрагмент скрипта для этого:

export SSHPASS=your-password-here
sshpass -e sftp -oBatchMode=no -b - sftp-user@remote-host << !
   cd incoming
   put your-log-file.log
   bye
!
анубхава
источник
3
Для его использования на Mac: stackoverflow.com/questions/9102557/…
anubhava
18
Не надо экспортировать, я думаю. SSHPASS=password sshpass -e ...стоит сделать.
Дженс
9
Я смог сделать однострочную загрузку файла журнала:sshpass -p "my_password" sftp -oPort=9999 user@host:dir/file.log
Cloud Artisans
6
@gorus: One-liner - это очень круто, но я не хотел использовать пароль в командной строке из-за повышенного риска отслеживания.
Анубхава
8
-oBatchMode=noбыл решающим недостающим элементом для меня.
Ричардкмиллер
99

Другой способ - использовать lftp:

lftp sftp://user:password@host  -e "put local-file.name; bye"

Недостаток этого метода заключается в том, что другие пользователи на компьютере могут читать пароль из подобных инструментов, psи этот пароль может стать частью истории вашей оболочки.

Более безопасная альтернатива, доступная с LFTP 4.5.0, - установка LFTP_PASSWORDпеременной среды и выполнение lftp с помощью --env-password. Вот полный пример:

LFTP_PASSWORD="just_an_example"
lftp --env-password sftp://user@host  -e "put local-file.name; bye"

LFTP также включает в себя классную функцию зеркалирования (может включать удаление после подтвержденной передачи --Remove-source-files):

lftp -e 'mirror -R /local/log/path/ /remote/path/' --env-password -u user sftp.foo.com
Karassik
источник
9
+1 за предложение альтернативы, но можно ли избежать ввода пароля в командной строке?
анубхава
1
Понижен за показ пароля любому пользователю на одном компьютере
Аарон Дигулла
10
Вы можете создать файл сценария для lftp, таким образом вам не нужно будет вводить пароль в командной строке. Создайте файл put-script: open sftp://user:password@host; put local-file.name; exit чем запустить. lftp -f put-script Таким образом, вам не нужно указывать имя пользователя и пароль в командной строке, и вы можете установить ограничительные разрешения для вашего файла сценария.
Обарановский
@obaranovsky Это хорошая идея. Интересно, если бы я добавил это к своей переменной среды в качестве псевдонима или функции, было бы безопасно и возможно ли скрыть это от других пользователей?
sdkks
1
Гораздо проще сделать, lftpчем возиться с sftpи sshpass. Хороший ответ.
MeanEYE
53

Expect - отличная программа для использования.

В Ubuntu установите его с помощью:

sudo apt-get install expect

На компьютере CentOS установите его с:

yum install expect

Допустим, вы хотите подключиться к серверу sftp, а затем загрузить локальный файл с локального компьютера на удаленный сервер sftp.

#!/usr/bin/expect

spawn sftp username@hostname.com
expect "password:"
send "yourpasswordhere\n"
expect "sftp>"
send "cd logdirectory\n"
expect "sftp>"
send "put /var/log/file.log\n"
expect "sftp>"
send "exit\n"
interact

Это открывает sftp-соединение с вашим паролем к серверу.

Затем он переходит в каталог, куда вы хотите загрузить свой файл, в данном случае «logdirectory»

Это загружает файл журнала из локального каталога, который находится в / var / log / с именем файла file.log, в «logdirectory» на удаленном сервере.

rezizter
источник
Спасибо за ваш ответ, я ожидал, как один из моих вариантов для достижения этой задачи.
Анубхава
Спасибо. Я нашел ваш ответ с помощью поиска, использовал его и успешно создал скрипт. Только что выложил скрипт для потерики
резизтер
Большое спасибо за ответ, я уже проголосовал за него :)
anubhava
Я использую это для ввода ключевой фразы для закрытого ключа SSH. Удобнее разместить один и тот же открытый ключ на всех серверах и просто периодически менять парольную фразу закрытого ключа.
sdkks
24

Вы можете использовать lftp в интерактивном режиме в сценарии оболочки, чтобы пароль не сохранялся в .bash_history или подобном, выполнив следующие действия:

vi test_script.sh

Добавьте следующее в ваш файл:

#!/bin/sh
HOST=<yourhostname>
USER=<someusername>
PASSWD=<yourpasswd>

cd <base directory for your put file>

lftp<<END_SCRIPT
open sftp://$HOST
user $USER $PASSWD
put local-file.name
bye
END_SCRIPT

И напишите / выйдите из редактора vi после того, как вы отредактируете host, user, pass и каталог для ввода :wqвведенного файла. Затем сделайте ваш скрипт исполняемым chmod +x test_script.shи выполните его ./test_script.sh.

Майк С.
источник
2
Чтобы перезаписать существующий файл, добавьте «set xfer: clobber on» после lftp << END_SCRIPT
Balaji Natarajan
17

Меня недавно попросили переключиться с ftp на sftp, чтобы обеспечить передачу файлов между серверами. Мы используем пакет Tectia SSH, в котором есть возможность --passwordпередать пароль в командной строке.

пример : sftp --password="password" "userid"@"servername"

Пакетный пример:

(
  echo "
  ascii
  cd pub
  lcd dir_name
  put filename
  close
  quit
    "
) | sftp --password="password" "userid"@"servername"

Я подумал, что должен поделиться этой информацией, так как я просматривал различные веб-сайты перед запуском команды help ( sftp -h) и был удивлен, увидев параметр пароля.

Махони
источник
9
+1 для вас хорошее предложение. Однако для этого потребуется psввести пароль в командной строке, и любой пользователь системы, выполняющей команду, сможет увидеть ваш пароль.
13
4
Я попробовал это, я получилunknown option -- - usage: sftp [-1246aCfpqrv] [-B buffer_size] [-b batchfile] [-c cipher] [-D sftp_server_path] [-F ssh_config] [-i identity_file] [-l limit] [-o ssh_option] [-P port] [-R num_requests] [-S program] [-s subsystem | sftp_server] host sftp [user@]host[:file ...] sftp [user@]host[:dir[/]] sftp -b batchfile [user@]host
cyber8200
1
@ihue, вероятно, потому что вам нужен Techia SSH , а не OpenSSH
qris
17

Вы можете переопределить, включив аутентификацию без пароля. Но вы должны установить ключи (pub, priv), прежде чем идти на это.

Выполните следующие команды на локальном сервере.

Local $> ssh-keygen -t rsa 

Нажмите клавишу ВВОД для всех предложенных вариантов. Нет необходимости вводить значения.

Local $> cd .ssh
Local $> scp .ssh/id_rsa.pub user@targetmachine:
Prompts for pwd$>  ENTERPASSWORD

Подключитесь к удаленному серверу, используя следующую команду

Local $> ssh user@targetmachine
Prompts for pwd$> ENTERPASSWORD

Выполните следующие команды на удаленном сервере

Remote $> mkdir .ssh
Remote $> chmod 700 .ssh
Remote $> cat id_rsa.pub >> .ssh/authorized_keys
Remote $> chmod 600 .ssh/authorized_keys
Remote $> exit

Выполните следующую команду на локальном сервере, чтобы проверить аутентификацию без пароля. Он должен быть подключен без пароля.

$> ssh user@targetmachine
SriniV
источник
1
+1 за ваш ответ, но вопрос был в том, чтобы сделать это без открытых / закрытых ключей.
Анубхава
упс .. Только что увидел ограничения на обмен ключами :)
SriniV
Из любопытства будет ли эта команда lftp -p ${port} -u ${login_id},${password} ${ip_number}при вызове из сценария оболочки печатать их где-нибудь? Как вы решили помимо sshpass?
SriniV
Я не имею lftpи полагаюсь на sshpassMac и Linux оба.
Анубхава
Чистое золото. Спасибо! :)
Николай Ценков
7

Объедините sshpass с заблокированным файлом учетных данных, и на практике он так же безопасен, как и все остальное - если у вас есть root на коробке для чтения файла учетных данных, все ставки в любом случае отключены.

Рич Хардинг
источник
5

Программа Bash, ожидающая, пока sftp запросит пароль, и отправит его вместе:

#!/bin/bash
expect -c "
spawn sftp username@your_host
expect \"Password\"
send \"your_password_here\r\"
interact "

Вам может потребоваться установить ожидаемый, измените формулировку «Пароль» на строчную букву «p», чтобы соответствовать тому, что получает ваш запрос. Проблема здесь в том, что он предоставляет ваш пароль в виде обычного текста в файле, а также в истории команд. Который почти побеждает цель иметь пароль во-первых.

Эрик Лещинский
источник
+1 но я думаю, что вы четко заявите, в чем проблемы с этим подходом.
анубхава
5

Вы можете использовать sshpass для этого. Ниже приведены шаги

  1. Установите sshpass для Ubuntu - sudo apt-get install sshpass
  2. Добавьте удаленный IP-адрес в файл известного хоста, если это первый раз. Для Ubuntu -> ssh user @ IP -> введите «да».
  3. дайте объединенную команду scp и sshpass для этого. Ниже приведен пример кода для военного копирования на удаленный кот sshpass -p '#Password_For_remote_machine' scp /home/ubuntu/latest_build/abc.war #user@#RemoteIP:/var/lib/tomcat7/webapps
Рави Ранджан
источник