我知道不建议这样做,但是是否可以将用户密码传递给scp?
我想通过scp复制文件作为批处理作业的一部分,而接收服务器当然需要密码,不,我不能轻易将其更改为基于密钥的身份验证。
答案 0 :(得分:425)
使用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
以上复制从远程主机到本地的路径内容。
安装:
apt install sshpass
yum install sshpass
port install sshpass
brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb
答案 1 :(得分:40)
只需生成一个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
答案 2 :(得分:32)
如果从Windows连接到服务器,scty(“pscp”)的Putty版本允许您使用-pw
参数传递密码。
答案 3 :(得分:25)
答案 4 :(得分:18)
您可以在unix / terminal
上使用'expect'脚本例如,创建'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
我希望有所帮助。
答案 5 :(得分:14)
curl可以用作scp的替代方法来复制文件,它在命令行上支持密码。
curl --insecure --user username:password -T /path/to/sourcefile sftp://desthost/path/
答案 6 :(得分:9)
以下是使用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;
}
答案 7 :(得分:6)
没人提到它,但是Putty scp(pscp)有一个密码的-pw选项。
可以在此处找到文档:https://the.earth.li/~sgtatham/putty/0.67/htmldoc/Chapter5.html#pscp
答案 8 :(得分:3)
/etc/ssh/sshd_config
,找到PasswordAuthentication=no
行并将其注释掉(在行的开头放置#
),保存文件并运行{{ 1}}以应用配置。如果没有这样的行,那么您就完成了。sudo systemctl restart ssh
添加到您的-o PreferredAuthentications="password"
命令中,例如:
scp
答案 9 :(得分:2)
确保您之前有“期待”工具,如果没有,请执行
# 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”工具
执行脚本文件 # expect /root/scriptfile
答案 10 :(得分:2)
如上所述设置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
命令而不使用密码。
答案 11 :(得分:1)
您可以使用ssh-copy-id
添加ssh密钥:
$which ssh-copy-id #check whether it exists
如果存在:
ssh-copy-id "user@remote-system"
答案 12 :(得分:0)
另一种方法是将用户密钥的公共一半添加到目标系统上的授权密钥文件中。在您启动传输的系统上,您可以运行ssh-agent守护程序并将密钥的私有部分添加到代理程序。然后可以将批处理作业配置为使用代理获取私钥,而不是提示输入密钥。
这应该可以在UNIX / Linux系统或Windows平台上使用pageant和pscp进行。
答案 13 :(得分:0)
这里有个穷人的类似Linux / Python / Expect的示例,该博客基于Upgrading simple shells to fully interactive TTYs。对于无法安装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
答案 14 :(得分:0)
如果您发现严格的主机密钥检查错误,请使用-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
答案 15 :(得分:0)
将文件从一台服务器复制到另一台服务器(在脚本上)
在 ubuntu 或其他 Linux 机器上安装 putty。 putty 自带 pscp。我们可以用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 帮助。
答案 16 :(得分:-1)
上述所有解决方案仅在安装了应用程序后才有效,或者您应该具有安装权限(sshpass或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/
答案 17 :(得分:-3)
获取sshpass的步骤对于rhel / centos 6:
def pick_date(date)
@browser.td(aria_label: /#{date.strftime(%A, %B %e, %Y)}/).click
end
答案 18 :(得分:-9)
我发现这真的很有帮助here。
rsync -r -v --progress -e ssh user@remote-system:/address/to/remote/file /home/user/
您不仅可以传递密码,还可以在复制时显示进度条。真棒。