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

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

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


person Argelbargel    schedule 08.09.2008    source источник
comment
См. Также (далее) вопрос: stackoverflow.com/questions/1462284/, где в одном ответе упоминается другой возможный способ сделать это. (NB: это не повторяющийся вопрос - это оригинал, который дублируют другие.)   -  person Jonathan Leffler    schedule 23.09.2009


Ответы (19)


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

person Pat Notz    schedule 08.09.2008
comment
Ссылка на expect.nist.gov не работает. Может быть, это ?: expect.sourceforge.net - person Katapofatico; 04.10.2016
comment
sudo apt-get install ожидать - person SDsolar; 23.01.2017
comment
›› brew info sshpass Ошибка: нет формулы с именем sshpass. Мы не будем добавлять sshpass, потому что это упрощает для начинающих пользователей SSH нарушение безопасности SSH. ;) - person Lukas N.P. Egger; 16.10.2018

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

sshpass -p "password" scp -r [email protected]:/some/remote/path /some/local/path

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

sshpass -f "/path/to/passwordfile" scp -r [email protected]:/some/remote/path /some/local/path

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

Установить:

  • ubuntu/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
person KevinS    schedule 19.12.2012
comment
Это недавно избавило меня от многих проблем с проектом, спасибо :) - person Elliott; 12.04.2013
comment
В Ubuntu 12.04 у меня это работало только с одинарными кавычками над паролем (например, «пароль» вместо пароля). - person odedfos; 06.02.2014
comment
@odedfos, да, вам нужно использовать одинарные кавычки, потому что некоторые символы, сгенерированные паролем, могут иметь специальную интерпретацию при интерполяции строк с двойными кавычками - person TerryE; 19.07.2014
comment
Вот как вы устанавливаете sshpass apt-get install sshpass - person Jan-Terje Sørensen; 21.08.2014
comment
В CentOS это yum -y install sshpass - person jgritty; 29.08.2014
comment
sudo port install sshpass если у вас есть macports на Mac - person kdauria; 03.12.2014
comment
Самый безопасный способ сделать это - использовать файл с паролем, например: sshpass -f passwdfile` scp [...] _ 2_ps` списки и т. Д., И вы можете защитить пароль с помощью файловых разрешений. - person Christopher Schultz; 20.03.2015
comment
В OSX brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb - person Abram; 25.05.2016
comment
scp показывает прогресс, когда sshpass не используется. Можно ли это вернуть? - person Daniel; 13.07.2017
comment
Лучший ответ: обратите внимание, что он также работает с ssh (sshpass -p pass ssh 'command') - person рüффп; 06.06.2018
comment
Это работает, но вывод консоли из scp скрыт. - person Jim Fell; 15.02.2019
comment
URL-адрес для macOS изменен на: brew install raw.githubusercontent. com / kadwanev / bigboybrew / master / Library / - person neowinston; 28.02.2020
comment
В Debian у меня не работало -f "filename", пока я не удалил кавычки вокруг имени файла, например: sshpass -f /path/to/passwordfile scp -r [email protected]:/some/remote/path /some/local/path - person rshev; 27.09.2020
comment
В случае, если вы наблюдаете ошибку строгой проверки ключа хоста, вы можете добавить -o с параметрами StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null. Полный пример выглядит следующим образом sshpass -p "password" scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null [email protected]:/tmp/from/psoutput /tmp/to/psoutput - person Sachin Rastogi; 02.12.2020

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

ssh-keygen -t rsa -C "[email protected]"

скопируйте содержимое ~/.ssh/id_rsa.pub и, наконец, добавьте его на удаленные машины ~/.ssh/authorized_keys

убедитесь, что удаленный компьютер имеет разрешения 0700 for ~./ssh folder и 0600 for ~/.ssh/authorized_keys

person mustafaturan    schedule 21.02.2012
comment
Как я уже писал: Нет, я не могу легко переключиться на аутентификацию на основе ключей. - person Argelbargel; 09.03.2012
comment
Вы имеете в виду .authorized_keys, а не. authorization_keys? - person SmallChess; 23.04.2015
comment
Допустимым использованием для этого может быть сценарий bash, который выполняет несколько вызовов scp / ssh на сервер, на котором вы хотите запросить у пользователя пароль для удаленного сервера. В этом случае пароль не будет отображаться в истории, и вы все равно сможете запросить пароль ... но только один раз. Я не хочу использовать ключевой файл, потому что хочу аутентифицировать пользователя скрипта. - person Wes Grant; 27.08.2015
comment
Другой допустимый вариант использования - если вы не можете легко включить аутентификацию на основе ключей для цели. Пример: один из основных производителей NAS - Synology с их DSM 6.0 - не поддерживает его даже в 2016 году. Конечно, вы можете испортить файлы конфигурации и надеяться, что обновление не просто перезапишет их снова (обновление DSM часто нарушает пользовательские модификации ). Иногда - особенно когда ОП прямо пишет, что они уже знают, что это не оптимально - людям просто нужно решение. - person Aaa; 03.06.2016
comment
Вы должны использовать ssh-copy-id -i ~/.ssh/id_rsa.pub <remote_server> для копирования ключа на удаленный сервер - person RousseauAlexandre; 29.11.2018
comment
@RousseauAlexandre вы имеете в виду на или на сервер удаления? Этот ответ шокирует, разве это не ваш_пользователь @ сервер? - person mckenzm; 07.06.2019
comment
@mckenzm ssh-copy-id скопируйте открытый ключ с вашего локального компьютера на сервер. Вам следует попробовать man ssh-copy-id, чтобы получить больше информации об этой команде. - person RousseauAlexandre; 07.06.2019
comment
извиняюсь, я перепутал свои комментарии. Я не хотел сказать, что ваш комментарий был шокирующим, я должен был разделить их, чтобы показать ответ выше, это было удивительно. - person mckenzm; 08.06.2019
comment
Да ладно, кто угодно может узнать, как сгенерировать ключи SSH, вопрос явно не в этом. Не у всех есть полный контроль над каждым компьютером, к которому они подключаются. - person Andrew Koster; 17.03.2020

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

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

person gWay    schedule 30.11.2010
comment
Покажите, пожалуйста, пример. - person SDsolar; 23.01.2017
comment
Кроме того, вы можете добавить C: \ Program Files (x86) \ PuTTY к вашему пути, чтобы использовать эти команды. - person SDsolar; 23.01.2017
comment
@SDsolar вот пример синтаксиса: pscp -pw 'MyPa$$word' username@servername:/somedir/somefile ~/somedest (Ненавижу использовать такую ​​замазку, но она работает) - person geneorama; 30.08.2017
comment
ОП четко задан в контексте Linux. - person Jepper; 12.02.2021

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

curl --insecure --user username:password -T /path/to/sourcefile sftp://desthost/path/
person MBerg    schedule 16.11.2017
comment
Он довольно медленнее, чем scp, но отлично справляется со своей задачей. - person Victor; 29.05.2018
comment
Я обнаружил, что это происходит быстрее, когда пункт назначения настроен с огромной задержкой запроса пароля. scp пришлось ждать более 30 секунд, чтобы я мог ввести пароль, но curl немедленно сработал. - person Ghost8472; 11.09.2018
comment
@ Ghost8472 настроен да, но иногда эта задержка связана с разрешением имени хоста, а также случается с sftp. - person mckenzm; 07.06.2019
comment
У меня завиток: (1) Протокол sftp не поддерживается или не отключен в libcurl - person kronuus; 06.02.2020

Вы можете использовать сценарий 'expect' в 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 

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

person Prabhjeet    schedule 16.01.2013
comment
Предварительное условие: sudo apt-get install expect - person SDsolar; 23.01.2017

Вот пример того, как вы это делаете с помощью expect tool:

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;
}
person Espo    schedule 08.09.2008
comment
Это на Perl, извините, я этого не писал. (5 лет назад :) ) - person Espo; 24.06.2013

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

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

person galushka    schedule 13.05.2015
comment
Об этом упоминалось в ответе user524607 5 лет назад. - person Barmar; 30.09.2015
comment
Нашел и добавляю на свой путь C: \ Program Files (x86) \ PuTTY. - person SDsolar; 23.01.2017
comment
Под ВИНОМ? в Windows используйте plink. BTW people putty-tools - это пакет. - person mckenzm; 09.06.2021

Вы можете использовать ssh-copy-id для добавления ключа ssh:

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

Если существует:

ssh-copy-id  "user@remote-system"
person Shen JI    schedule 22.11.2016
comment
Превосходно. Просто, работает, никаких сторонних пакетов или установки ssh-keygen не требуется. - person SigmaX; 08.07.2021

После настройки ssh-keygen, как описано выше, вы можете делать

scp -i ~/.ssh/id_rsa /local/path/to/file [email protected]:/path/in/remote/server/

Если вы хотите, чтобы каждый раз печатал меньше, вы можете изменить свой .bash_profile файл и поместить

alias remote_scp='scp -i ~/.ssh/id_rsa /local/path/to/file [email protected]:/path/in/remote/server/

Затем с вашего терминала сделайте source ~/.bash_profile. Впоследствии, если вы наберете remote_scp в своем терминале, он должен запустить команду scp без пароля.

person hi15    schedule 20.10.2017

  1. Убедитесь, что на целевом сервере включена аутентификация по паролю. Если он работает под управлением Ubuntu, откройте /etc/ssh/sshd_config на сервере, найдите строки PasswordAuthentication=no и закомментируйте их (поместите # в начало строки), сохраните файл и запустите sudo systemctl restart ssh, чтобы применить конфигурацию. Если такой строки нет, все готово.
  2. Add -o PreferredAuthentications="password" to your scp command, e.g.:
    scp -o PreferredAuthentications="password" /path/to/file user@server:/destination/directory
    
person Finesse    schedule 14.09.2020
comment
Но как вы указываете фактический пароль? - person Osmar; 20.11.2020
comment
@Osmar Вам будет предложено ввести пароль, когда вы запустите команду - person Finesse; 21.11.2020

  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

person Kevin Chui    schedule 21.03.2014

Вот пример бедного человека в стиле Linux / Python / Expect, основанный на этом сообщении в блоге: Обновление простых оболочек до полностью интерактивных телетайпов. Мне это было нужно для старых машин, на которых я не могу установить Expect или добавить модули в Python.

Код:

(
    echo 'scp [email protected]:./install.sh .'
    sleep 5
    echo 'scp-passwd'
    sleep 5
    echo 'exit'
) |

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

Выход:

scp [email protected]:install.sh .
bash-4.2$ scp [email protected]:install.sh .
Password: 
install.sh                                 100%   15KB 236.2KB/s   00:00    
bash-4.2$ exit
exit
person JohnMudd    schedule 09.12.2019

В случае, если вы наблюдаете ошибку строгой проверки ключа хоста, используйте параметры -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null.

Полный пример выглядит следующим образом sshpass -p "password" scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null [email protected]:/tmp/from/psoutput /tmp/to/psoutput

person Sachin Rastogi    schedule 02.12.2020

копировать файлы с одного сервера на другой (по скриптам)

Установите putty на ubuntu или другие машины с Linux. шпатлевка идет в комплекте с пскп. мы можем копировать файлы с помощью pscp.

apt-get update
apt-get install putty 
echo n |  pscp -pw "Password@1234" -r user_name@source_server_IP:/copy_file_path/files /path_to_copy/files

Дополнительные параметры см. В справке pscp.

person Sudheer Mareddy    schedule 12.04.2021

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

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

person rjray    schedule 16.09.2008
comment
В вопросе говорилось, что он не может использовать аутентификацию на основе ключей. - person Barmar; 30.09.2015
comment
Кроме того, если бы это был я, я бы не смог изменить другой сервер - все, что мне нужно, - это скопировать файл. - person SDsolar; 23.01.2017

шаги для получения 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

person Long    schedule 19.02.2018

Все упомянутые выше решения могут работать только в том случае, если вы установили приложение или у вас должны быть права администратора для установки, кроме или 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/

person Yash    schedule 05.09.2019
comment
Как запустить scp в фоновом режиме и ввести пароль ?? - person thomas.han; 28.04.2020

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

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

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

person valk    schedule 25.02.2014
comment
и как именно вы здесь вводите пароль? - person infografnet; 03.06.2014