Как запустить команду sftp с паролем из Bash script?
Мне нужно перенести файл журнала на удаленный хост, используя sftp с хоста Linux. Мне была предоставлена учетная запись для моей группы операций. Однако, поскольку у меня нет контроля над другим хостом, я не могу генерировать и передавать ключи RSA с другим хостом.
Итак, есть способ запустить команду sftp
(с указанием имени пользователя/пароля) из Bash script через cron?
Я нашел аналогичный вопрос, Укажите пароль для sftp в Bash script, но удовлетворительного ответа на мою проблему не было.
Ответы
Ответ 1
У вас есть несколько параметров, отличных от проверки подлинности с открытым ключом:
- Используйте keychain
- Используйте sshpass (менее защищенный, но, вероятно, соответствующий вашим требованиям)
- Использовать ожидать (наименее защищенный и более необходимый код)
Если вы решите дать sshpass, здесь есть рабочий фрагмент script, чтобы сделать это:
export SSHPASS=your-password-here
sshpass -e sftp -oBatchMode=no -b - [email protected] << !
cd incoming
put your-log-file.log
bye
!
Ответ 2
Другим способом было бы использовать lftp:
lftp sftp://user:[email protected] -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://[email protected] -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
Ответ 3
Ожидание - отличная программа для использования.
На 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" на удаленном сервере
Ответ 4
Вы можете использовать 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
.
Ответ 5
Вы можете переопределить, включив пароль с меньшей аутентификацией. Но перед этим нужно установить ключи (pub, priv).
Выполните следующие команды на локальном сервере.
Local $> ssh-keygen -t rsa
Нажмите ENTER для всех запрошенных опций. Не нужно вводить значения.
Local $> cd .ssh
Local $> scp .ssh/id_rsa.pub [email protected]:
Prompts for pwd$> ENTERPASSWORD
Подключитесь к удаленному серверу, используя следующую команду
Local $> ssh [email protected]
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 [email protected]
Ответ 6
Недавно мне было предложено переключиться с 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
Объедините sshpass с заблокированным файлом учетных данных и на практике он будет защищен как что угодно - если у вас есть root в поле для чтения файла учетных данных, все ставки все равно.
Ответ 8
Bash, чтобы ждать, пока sftp запросит пароль, и отправьте его по следующему адресу:
#!/bin/bash
expect -c "
spawn sftp [email protected]_host
expect \"Password\"
send \"your_password_here\r\"
interact "
Вам может потребоваться установить ожидание, изменить формулировку "Пароль" на нижний регистр "p", чтобы соответствовать тому, что получает ваш запрос. Проблемы здесь состоят в том, что он предоставляет ваш пароль в виде обычного текста в файле, а также в истории команд. Что почти побеждает цель иметь пароль в первую очередь.
Ответ 9
Вы можете использовать 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 #[email protected]#RemoteIP:/var/lib/tomcat7/webapps
Ответ 10
Для искателей, которым все равно, что пароль можно увидеть в командной строке:
sftp userid:[email protected]
- как включить пароль в команду sftp
connect.