Ответ 1
Вы можете создать скрипт с помощью такого инструмента, как ожидать (есть также удобные привязки, например Pexpect для Python).
Я знаю, что это не рекомендуется, но возможно ли передать пароль пользователя на scp?
Я хотел бы скопировать файл через scp как часть пакетного задания, и серверу-получателю, конечно же, нужен пароль, и нет, я не могу легко изменить его на проверку подлинности на основе ключей.
Вы можете создать скрипт с помощью такого инструмента, как ожидать (есть также удобные привязки, например Pexpect для Python).
Используйте 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
Вышеуказанное копирует содержимое пути с удаленного хоста на ваш локальный.
Установить:
apt install sshpass
yum install sshpass
port install sshpass
brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb
просто сгенерируйте ssh-ключ, например:
ssh-keygen -t rsa -C "[email protected]"
скопировать содержимое ~/.ssh/id_rsa.pub
и, наконец, добавить его к удаленным машинам ~/.ssh/authorized_keys
убедитесь, что удаленная машина имеет разрешения 0700 for ~./ssh folder
и 0600 for ~/.ssh/authorized_keys
Если вы подключаетесь к серверу из Windows, версия scp ("pscp") Putty позволяет передавать пароль с -pw
параметра -pw
.
Вы можете использовать "ожидать" script в unix/terminal
Например, создайте 'test.exp':
#!/usr/bin/expect
spawn scp /usr/bin/file.txt [email protected]<ServerLocation>:/home
set pass "Your_Password"
expect {
password: {send "$pass\r"; exp_continue}
}
запустите script
expect test.exp
Надеюсь, это поможет.
Вот пример того, как вы это делаете с помощью инструмента 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;
}
Никто не упомянул об этом, но Штукатура scp (pscp) имеет параметр -pw для пароля.
Документацию можно найти здесь: https://the.earth.li/~sgtatham/putty/0.67/htmldoc/Chapter5.html#pscp
curl может использоваться как альтернатива scp для копирования файла и он поддерживает пароль в командной строке.
curl --insecure --user username:password -T /path/to/sourcefile sftp://desthost/path/
убедитесь, что у вас есть инструмент "ожидать", если нет, сделайте это
# apt-get install expect
создайте файл script со следующим содержимым. (# vi/root/scriptfile)
spawn scp /path_from/file_name [email protected]_host_name:/path_to
expect "password:"
send put_password_here\n;
interact
выполнить файл script с помощью инструмента "Ожидание"
# expect /root/scriptfile
Вы можете использовать ssh-copy-id
для добавления ssh-ключа:
$which ssh-copy-id #check whether it exists
Если существует:
ssh-copy-id "[email protected]"
После настройки 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
без пароля.
Альтернативой будет добавление открытой половины пользовательского ключа в файл авторизованных ключей в целевой системе. В системе, с которой вы инициируете передачу, вы можете запустить демон 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 [email protected]:/address/to/remote/file /home/user/
Не только вы можете передать там пароль, но также покажет индикатор выполнения при копировании. Действительно удивительный.