Як передати пароль для scp?


297

Я знаю, що це не рекомендується, але чи взагалі можна передавати пароль користувача scp?

Я хотів би скопіювати файл через scp як частину пакетної роботи, і сервісу, що приймає, звичайно, потрібен пароль, і, ні, я не можу легко змінити це на автентифікацію на основі ключа.


2
Дивіться також (пізніше) питання: stackoverflow.com/questions/1462284/… де одна відповідь згадує інший можливий спосіб це зробити. (Зверніть увагу: це не повторне запитання - це оригінал, який інші копіюють.)
Джонатан Леффлер

Відповіді:


35

Ви можете його скриптувати за допомогою інструменту, як очікувати (є і зручні прив'язки, як Pexpect для Python).


1
Посилання на очікуваний.nist.gov порушено. Можливо, це ?: очаквайте.sourceforge.net
Katapofatico

sudo apt - get install очікують
SDsolar

>> Заварити інформацію sshpass Помилка: Немає доступної формули з назвою "sshpass" Ми не додамо sshpass, оскільки це надто просто для початківців користувачів SSH зруйнувати безпеку SSH. ;)
Лукас NP Еггер

528

Використовуйте sshpass :

sshpass -p "password" scp -r user@example.com:/some/remote/path /some/local/path

інакше пароль не відображається в історії баш

sshpass -f "/path/to/passwordfile" scp -r user@example.com:/some/remote/path /some/local/path

Наведене вище копіює вміст шляху від віддаленого хоста до вашого локального.

Встановити:

  • ubuntu / debian
    • apt install sshpass
  • центос / федора
    • yum install sshpass
  • mac w / macports
    • port install sshpass
  • mac w / варити
    • brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb

14
У Ubuntu 12.04 він працював для мене лише з однією котировкою пароля (наприклад, «пароль» замість «пароль»).
odedfos

6
@odedfos, так, вам потрібно використовувати одинарні лапки, тому що деякі символи, згенеровані паролем, можуть мати спеціальну інтерпретацію в інтерполяції рядків з подвійним цитуванням
TerryE,

7
Так ви встановлюєте sshpassapt-get install sshpass
Jan-Terje Sørensen

6
На CentOS цеyum -y install sshpass
jgritty

19
Найбезпечніший спосіб зробити це з файлом паролів , наприклад таким: sshpass -f passwdfile` scp [...] . This way, the password won't show up in ps` списки тощо, і ви можете захистити пароль за допомогою дозволів на файли.
Крістофер Шульц

50

просто генеруйте ключ ssh на зразок:

ssh-keygen -t rsa -C "your_email@youremail.com"

скопіюйте вміст ~/.ssh/id_rsa.pub і нарешті додайте його до віддалених машин~/.ssh/authorized_keys

переконайтеся, що віддалений апарат має дозволи 0700 for ~./ssh folderта0600 for ~/.ssh/authorized_keys


35
Як я писав: Ні, я не можу легко перейти до аутентифікації на основі ключів.
Арджельбаргель

3
Ви маєте на увазі .authorized_keys, а не. Авторизація_ ключі?
HelloWorld

2
Допустимим використанням для цього буде скрипт bash, який робить кілька scp / ssh дзвінків на сервер, де ви хочете запитати у користувача пароль для віддаленого сервера. Потім пароль не відображатиметься в історії, і ви все ще маєте намір оскаржувати пароль ... але лише один раз. Я не хочу використовувати файл ключів, тому що я хочу все-таки автентифікувати користувача сценарію.
Уес Грант

2
Ще одне дійсне використання буде, якщо ви не можете легко ввімкнути автентифікацію на основі ключа на цілі. Приклад: Один з головних виробників NAS - Synology зі своїм DSM 6.0 - не підтримує його навіть у 2016 році. Звичайно, ви можете зіпсуватись із файлами конфігурації та сподіваєтесь, що оновлення не просто перезапише його (оновлення DSM часто не відповідає власним модифікаціям) ). Іноді - особливо коли ОР прямо пише, що вони вже знають, що це не оптимально - людям просто потрібно рішення.
Ааа

3
Вам слід ssh-copy-id -i ~/.ssh/id_rsa.pub <remote_server>скопіювати ключ на віддалений сервер
RousseauAlexandre

39

Якщо ви підключаєтесь до сервера з Windows, версія Putty scp ("pscp") дозволяє передати пароль з -pwпараметром.

Про це йдеться в тут документації.


1
Покажіть приклад, будь ласка.
SDsolar

Крім того, можливо, вам слід додати C: \ Program Files (x86) \ PuTTY до свого шляху, щоб використовувати ці команди.
SDsolar

1
@SDsolar ось приклад синтаксису: pscp -pw 'MyPa$$word' username@servername:/somedir/somefile ~/somedest(Я ненавиджу використовувати шпаклівку, як це, але вона працює)
geneorama

29

curl можна використовувати як альтернативу scp для копіювання файлу, і він підтримує пароль у командному рядку.

curl --insecure --user username:password -T /path/to/sourcefile sftp://desthost/path/

Це досить повільно, ніж "scp", але це робить роботу чудово.
Віктор

Я виявив, що це відбувається швидше, коли пункт призначення налаштовано з величезною затримкою пароля. scpдоводиться чекати 30+ секунд, щоб дозволити мені ввести пароль, але curlпрацював негайно.
Ghost8472

@ Ghost8472 налаштовано так, але іноді ця затримка вирішує ім'я хоста, а також трапляється для sftp.
mckenzm

1
Я отримав "curl: (1) Протокол" sftp "не підтримується або відключається в libcurl"
kronuus

21

Ви можете використовувати сценарій "очікувати" на unix / терміналі

Наприклад, створити 'test.exp':

#!/usr/bin/expect
        spawn scp  /usr/bin/file.txt root@<ServerLocation>:/home
        set pass "Your_Password"
        expect {
        password: {send "$pass\r"; exp_continue}
                  }

запустіть сценарій

expect test.exp 

Я сподіваюся, що це допомагає.


7
Обов’язкова
умова

10

Ось приклад того, як це зробити з expectінструментом:

sub copyover {
    $scp=Expect->spawn("/usr/bin/scp ${srcpath}/$file $who:${destpath}
+/$file");
    $scp->expect(30,"ssword: ") || die "Never got password prompt from
+ $dest:$!\n";
    print $scp 'password' . "\n";
    $scp->expect(30,"-re",'$\s') || die "Never got prompt from parent 
+system:$!\n";
    $scp->soft_close();
    return;
}

2
Це в перл, вибачте, що я цього не написав. (5 років тому :))
Еспо


3

Ви можете використовувати ssh-copy-idдля додавання ключа ssh:

$which ssh-copy-id #check whether it exists

Якщо існує:

ssh-copy-id  "user@remote-system"

3

Після налаштування, ssh-keygenяк було описано вище, ви можете зробити

scp -i ~/.ssh/id_rsa /local/path/to/file remote@ip.com:/path/in/remote/server/

Якщо ви хочете щоразу зменшувати введення тексту, ви можете змінити свій .bash_profileфайл і помістити

alias remote_scp='scp -i ~/.ssh/id_rsa /local/path/to/file remote@ip.com:/path/in/remote/server/

Потім з вашого терміналу зробіть source ~/.bash_profile. Після цього, якщо ви введете remote_scpсвій термінал, він повинен запустити scpкоманду без пароля.


2
  1. переконайтеся, що у вас є інструмент "очікувати" раніше, якщо ні, зробіть це

    # apt-get install expect

  2. створити файл сценарію із наступним вмістом. (# vi / root / scriptfile)

    spawn scp /path_from/file_name user_name_here@to_host_name:/path_to

    expect "password:"

    send put_password_here\n;

    interact

  3. виконати файл сценарію інструментом "очікувати"

    # expect /root/scriptfile


1

Ось приклад, подібний Linux / Python / очікуваний для бідної людини на основі цього повідомлення в блозі: Оновлення простих оболонок до повністю інтерактивних TTY . Мені це було потрібно для старих машин, де я не можу встановити Expect або додати модулі до Python.

Код:

(
    echo 'scp jmudd@mysite.com:./install.sh .'
    sleep 5
    echo 'scp-passwd'
    sleep 5
    echo 'exit'
) |

python -c 'import pty; pty.spawn("/usr/bin/bash")'

Вихід:

scp jmudd@mysite.com:install.sh .
bash-4.2$ scp jmudd@mysite.com:install.sh .
Password: 
install.sh                                 100%   15KB 236.2KB/s   00:00    
bash-4.2$ exit
exit

0

Альтернативою може бути додавання відкритої половини ключа користувача до файлу авторизованих ключів цільової системи. У системі, з якої ви ініціюєте передачу, ви можете запустити демон-ssh-агент і додати до агента приватну половину ключа. Потім пакетне завдання може бути налаштоване на використання агента для отримання приватного ключа, а не запитування пароля ключа.

Це має бути спроможним або в системі UNIX / Linux, або на платформі Windows, використовуючи виступ та pscp.


4
У запитанні сказано, що він не може використовувати автентифікацію на основі ключів.
Бармар

2
Крім того, якби це я, я припускаю, що я не можу змінити інший сервер - все, що я хочу, - це скопіювати файл.
SDsolar

-1

Усі вищезазначені рішення можуть працювати лише в тому випадку, якщо ви встановили додаток або у вас є права адміністратора на встановлення, крім або sshpass.

Я знайшов це дуже корисне посилання, щоб просто запустити scp у фоновому режимі.

$ nohup scp file_to_copy user@server:/path/to/copy/the/file > nohup.out 2>&1

https://charmyin.github.io/scp/2014/10/07/run-scp-in-background/


1
Як би запуск scp у фоновому режимі вводив пароль ??
thomas.han


-9

Я знайшов цю дійсно корисну відповідь тут .

rsync -r -v --progress -e ssh user@remote-system:/address/to/remote/file /home/user/

Ви не тільки можете передати туди пароль, але і він покаже смужку прогресу при копіюванні. Дійсно приголомшливий.


22
і як саме ви тут вводите пароль?
infografnet
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.