Как запустить команду sftp с паролем из скрипта Bash? - PullRequest
158 голосов
/ 22 марта 2011

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

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

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

Ответы [ 9 ]

160 голосов
/ 22 марта 2011

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

  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
!
88 голосов
/ 24 июля 2013

Другой способ - использовать 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
46 голосов
/ 28 марта 2013

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» на удаленном сервере

21 голосов
/ 30 июля 2013

Вы можете использовать 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 после того, как вы отредактируете хост, пользователя, пароль и каталог для вашего файла ввода, набрав :wq. Затем сделайте ваш скрипт исполняемым chmod +x test_script.sh и выполните его ./test_script.sh.

17 голосов
/ 20 февраля 2014

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

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

Local $> ssh-keygen -t rsa 

Нажмите ENTER для отображения всех предложенных параметров.Нет необходимости вводить значения.

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
16 голосов
/ 05 апреля 2013

Недавно меня попросили переключиться с 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"

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

7 голосов
/ 12 декабря 2011

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

5 голосов
/ 12 июня 2015

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

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

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

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

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

...