Как передать пароль на scp?


297

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

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


2
Смотрите также (позже) вопрос: stackoverflow.com/questions/1462284/… где один ответ упоминает другой возможный способ сделать это. (NB: это не дублирующий вопрос - это оригинал, который дублирует другой.)
Джонатан Леффлер

Ответы:


35

Вы можете написать его с помощью инструмента, как ожидаемо (есть также удобные привязки, такие как Pexpect для Python).


1
Ссылка на Ожидаем.nist.gov не работает. Может быть, это ?: ожидаем.sourceforge.net
Katapofatico

sudo apt-get ожидайте установки
SDsolar

>> brew info sshpass Ошибка: нет доступной формулы с именем «sshpass». Мы не будем добавлять sshpass, потому что это делает слишком легким для начинающих пользователей SSH разрушать безопасность SSH. ;)
Лукас Н.П. Эггер

528

Используйте sshpass :

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

или так пароль не отображается в истории Bash

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

Выше копирует содержимое пути с удаленного хоста на ваш локальный.

Установить:

  • убунту / Debian
    • apt install sshpass
  • CentOS / Fedora
    • yum install sshpass
  • mac w / macports
    • port install sshpass
  • Mac W / Brew
    • 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
Ян-Терье Соренсен

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
Как я уже писал: нет, я не могу легко переключиться на аутентификацию на основе ключей.
Argelbargel

3
Вы имеете в виду .authorized_keys, а не. authorization_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, версия scp для Putty («pscp») позволяет вам передать пароль с -pwпараметром.

Это упоминается в документации здесь.


1
Покажите пример, пожалуйста.
SDsolar

Также, возможно, вы захотите добавить C: \ Program Files (x86) \ PuTTY к вашему пути, чтобы использовать эти команды.
SDsolar

1
@Sdsolar вот пример синтаксиса: pscp -pw 'MyPa$$word' username@servername:/somedir/somefile ~/somedest(Я ненавижу использовать такую
замазку

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 / Terminal

Например, создайте '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
Это в Perl, извините, я этого не писал. (5 лет назад :))
Espo

8

Никто не упоминал об этом, но у Putty scp (pscp) есть опция -pw для пароля.

Документацию можно найти здесь: https://the.earth.li/~sgtatham/putty/0.67/htmldoc/Chapter5.html#pscp


9
Это было упомянуто в ответе пользователя 524607 5 лет назад.
Бармар

Нашел и добавляю C: \ Program Files (x86) \ PuTTY к моему пути.
SDsolar

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 / Expect, основанный на этом посте в блоге: Обновление простых оболочек до полностью интерактивных 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-agent и добавить частную половину ключа к агенту. Затем пакетное задание можно настроить на использование агента для получения закрытого ключа, а не запрашивать пароль ключа.

Это должно быть выполнимо либо в системе UNIX / Linux, либо на платформе Windows с использованием Pageant и 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
и как именно вы предоставляете пароль здесь?
инфографнет
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.