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

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

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

14 ответов


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


использовать 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

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

установка :

  • 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/ssh‌​pass.rb

просто создайте 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


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

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


вы можете использовать скрипт "expect" в unix/terminal

например, create ' 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 

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


вот пример того, как вы это делаете с :

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;
}

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

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

никто не упоминал об этом, но шпаклевка scp (pscp) имеет опцию-pw для пароля.

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


  1. убедитесь, что у вас есть" ожидать " инструмент, прежде чем, если нет, сделать это

    # apt-get install expect

  2. создайте файл сценария a со следующим содержимым. (# 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


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

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

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

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

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


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

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


шаги, чтобы получить 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


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

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

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