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

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

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

23 ответа

Решение

Вы можете написать сценарий с помощью такого инструмента, как ожидаемый (есть также удобные привязки, такие как 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

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

Установить:

  • убунт / Debian
    • apt install sshpass
  • CentOS / Fedora
    • yum install sshpass
  • Mac с 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, версия scp ("pscp") для Putty позволяет вам передавать пароль с -pw параметр.

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

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

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

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

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

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

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

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

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

Вот пример того, как вы делаете это с 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;
}

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

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

После того, как вы создали 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 Команда без пароля.

Вот пример бедняка 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
  1. Убедитесь, что на целевом сервере включена аутентификация по паролю. Если он работает под управлением Ubuntu, откройте /etc/ssh/sshd_config на сервере найдите строки PasswordAuthentication=no и закомментируйте их все (положите # в начале строки), сохраните файл и запустите sudo systemctl restart sshприменить конфигурацию. Если такой строки нет, все готово.
  2. Добавить -o PreferredAuthentications="password" на ваш scp команда, например:
    scp -o PreferredAuthentications="password" /path/to/file user@server:/destination/directory
    
  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

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

Установите 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.

Неинтерактивное использование SCP из Windows:

  • Установите версию сообществаnetcmdlets
  • Модуль импорта
  • ИспользоватьSend-PowerShellServerFile -AuthMode password -User MyUser -Password not-secure -Server YourServer -LocalFile C:\downloads\test.txt -RemoteFile C:\temp\test.txtдля отправки файла с неинтерактивным паролем

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

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

Поскольку отказ от использования аутентификации на основе ключей не указан в заголовке, следующие шаги помогут пользователям, которые могут переключиться на аутентификацию на основе ключей. Он пропускает пароли для scp и ssh.

Скопируйте свой открытый ключ ssh на сервер (будьте осторожны, не перезаписывайте авторизованные ключи)

      scp ~/.ssh/id_rsa.pub user@remoteIP:~/.ssh/authorized_keys

Измените разрешения:

      chmod 600 authorized_keys

Для получения более подробной информации следуйте такому руководству:https://idratherbewriting.com/jekylldoctheme-separate-outputs/mydoc/mydoc_no_password_prompts_scp.html .

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

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

Вы можете использовать следующие шаги. У меня это работает!

Шаг 1- создайте обычный файл, предположим "fileWithScpPassword", который содержит пароль ssh для целевого сервера.

Шаг 2- используйте sshpaas -f, за которым следует имя файла паролей, а затем обычную команду scp.

sshpass -f "fileWithScpPassword" scp / filePathToUpload пользователя @ ip : / destinationPath /

Один простой способ сделать это:

Используйте тот же scp cmd, что и с ключами ssh, т.е.

scp -C -i <path_to opens sshkey> <'local file_path'> user@<ip_address_VM>: <'remote file_path’>

для передачи файла с локального на удаленный

но вместо того, чтобы указать правильный <path_to_opensshkey>, используйте какой-то мусорный путь. Из-за неправильного пути к ключу вам будет предложено ввести пароль, и вы можете просто ввести пароль сейчас, чтобы выполнить работу!

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

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

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

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

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

Другие вопросы по тегам