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