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

143

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

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

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

Теги:
ssh
sftp

10 ответов

132
Лучший ответ

У вас есть несколько параметров, отличных от проверки подлинности с открытым ключом:

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

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

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/…
  • 0
    Привет, у меня есть похожая проблема, и я попытался использовать expect как других альтернатив нет на хосте. С expect я получаю эту ошибку .. Permission denied (publickey,keyboard-interactive). в Permission denied (publickey,keyboard-interactive). , Пожалуйста, дайте мне знать, как подключиться к хосту sftp с помощью passwd из скрипта bash.
Показать ещё 22 комментария
77

Другим способом было бы использовать 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
  • 9
    +1 за предложение альтернативы, но можно ли избежать ввода пароля в командной строке?
  • 1
    Downvoted за показ пароля любому пользователю на одном компьютере
Показать ещё 3 комментария
40

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

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

sudo apt-get install expect

На CentOS-машине установите его с помощью

yum install expect

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

#!/usr/bin/expect

spawn sftp [email protected]
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" на удаленном сервере

  • 0
    Спасибо за ваш ответ, я ожидал, как один из моих вариантов для достижения этой задачи.
  • 0
    Спасибо. Я нашел ваш ответ в результате поиска, использовал его и успешно создал сценарий. Только что выложил скрипт на поэтуру
Показать ещё 3 комментария
19

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

  • 2
    Чтобы перезаписать существующий файл, добавьте «set xfer: clobber on» после lftp << END_SCRIPT
16

Вы можете переопределить, включив пароль с меньшей аутентификацией. Но перед этим нужно установить ключи (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
  • 1
    +1 за ваш ответ, но вопрос был в том, чтобы сделать это без открытых / закрытых ключей.
  • 0
    упс .. только что увидел ограничения на обмен ключами :)
Показать ещё 4 комментария
15

Недавно мне было предложено переключиться с 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), и был удивлен, увидев пароль.

  • 9
    +1 для вас хорошее предложение. Однако для этого потребуется ввести пароль в командной строке, и любой пользователь системы, выполняющий команду ps , сможет увидеть ваш пароль.
  • 3
    Я попробовал это, я получил 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
Показать ещё 1 комментарий
7

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

5

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

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

Bash, чтобы ждать, пока sftp запросит пароль, и отправьте его по следующему адресу:

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

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

  • 0
    +1 но я думаю, что вы четко заявите, в чем проблемы с этим подходом.
0

Для искателей, которым все равно, что пароль можно увидеть в командной строке:

sftp userid:password@remoteHost - как включить пароль в команду sftp connect.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню