Як запустити команду 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 / ...
анубхава

18
Думаю, не потрібно експортувати. SSHPASS=password sshpass -e ...повинен робити.
Єнс

9
Мені вдалося зробити одне вкладиш для завантаження файлу журналу:sshpass -p "my_password" sftp -oPort=9999 user@host:dir/file.log
Cloud Artisans

6
@gorus: Одноклассниця дуже крута, однак я не хотів використовувати пароль у командному рядку через підвищені ризики перегляду.
anubhava

8
-oBatchMode=noбула для мене найважливішою відсутністю.
richardkmiller

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

9
+1 за пропозицію альтернативи, але чи можемо ми уникати введення пароля в командному рядку?
anubhava

1
Дозволено показувати пароль будь-кому на тому ж комп’ютері
Aaron Digulla

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 Machine встановіть його за допомогою:

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


Дякую за вашу відповідь, я очікував як один із своїх варіантів досягнення цього завдання.
anubhava

Дякую. Я знайшов вашу відповідь шляхом пошуку, використав її та склав сценарій успішно з очікуванням. Щойно опублікував сценарій для поетеси
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 після редагування хоста, користувача, проходу та каталогу для введення файлу put. :wqПотім зробіть свій сценарій виконуваним chmod +x test_script.shта виконайте його ./test_script.sh.


2
Щоб замінити існуючий файл, додайте "встановити 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"

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


9
+1 для вас гарна пропозиція. Однак для цього потрібно буде ввести пароль в командному рядку, і будь-хто в системі, яка виконує psкоманду, зможе побачити ваш пароль.
anubhava

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 

Натисніть клавішу 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 для вашої відповіді, але питання стосувалося цього без публічних / приватних ключів.
anubhava

oops .. Щойно побачив обмеження щодо спільного використання ключів :)
SriniV

Чи не з цікавості ця команда, lftp -p ${port} -u ${login_id},${password} ${ip_number}коли буде викликана сценарій оболонки, надрукує їх десь? Як ви вирішили окрім sshpass?
SriniV

Я не маю lftpі покладаюсь на sshpassMac і Linux обидва.
anubhava

Чисте золото. Дякую! :)
Микола Ценков

7

Поєднайте sshpass із зафіксованим файлом облікових даних і, на практиці, це так само безпечно - якщо у вас є корінь, щоб прочитати файл облікових даних, усі ставки все одно знімаються.


5

Програма Bash чекати sftp, щоб запитати пароль, а потім надсилати його разом:

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

Можливо, вам доведеться встановити очікування, змінити формулювання "Пароль" на мале "p", щоб відповідати тому, що отримує ваш запит. Проблеми тут полягають у тому, що він відкриває ваш пароль у простому тексті у файлі, а також в історії команд. Що майже перемагає призначення першого пароля.


+1, але я думаю, ви чітко заявляєте, які проблеми з цим підходом.
anubhava

5

Ви можете використовувати sshpass для цього. Нижче наведені етапи

  1. Встановити sshpass для Ubuntu - sudo apt-get install sshpass
  2. Додайте віддалений IP до відомого файлу хоста, якщо це вперше. Для Ubuntu -> ssh user @ IP -> введіть "так"
  3. дайте комбіновану команду scp та sshpass для цього. Нижче наведено зразок коду для подолання війни на віддаленому tomcat sshpass -p '#Password_For_remote_machine' scp /home/ubuntu/latest_build/abc.war #user@#RemoteIP:/var/lib/tomcat7/webapps
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.