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

297

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

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

Argelbargel
источник
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
Kevins
источник
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

mustafaturan
источник
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параметром.

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

gWay
источник
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/
MBerg
источник
Это намного медленнее, чем «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 

Надеюсь, это поможет.

Prabhjeet
источник
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
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команду без пароля.

hi15
источник
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
JohnMudd
источник
0

В качестве альтернативы можно добавить открытую половину ключа пользователя в файл авторизованных ключей в целевой системе. В системе, из которой вы инициируете передачу, вы можете запустить демон ssh-agent и добавить частную половину ключа к агенту. Затем пакетное задание можно настроить на использование агента для получения закрытого ключа, а не запрашивать пароль ключа.

Это должно быть выполнимо либо в системе UNIX / Linux, либо на платформе Windows с использованием Pageant и pscp.

rjray
источник
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
-3

шаги, чтобы получить sshpass для rhel / centos 6:

# wget http://epel.mirror.net.in/epel/6/i386/epel-release-6-8.noarch.rpm
# rpm -ivh epel-release-6-8.noarch.rpm
# yum install sshpass

источник: https://community.mapr.com/thread/9040

Длинный
источник
-9

Я нашел этот действительно полезный ответ здесь .

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

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

Валк
источник
22
и как именно вы предоставляете пароль здесь?
инфографнет