我知道不推荐这样做,但是是否可以将用户密码传递给scp?
作为批处理作业的一部分,我想通过scp复制文件,接收服务器当然需要密码,不,我不能轻易地将其更改为基于密钥的身份验证。
我知道不推荐这样做,但是是否可以将用户密码传递给scp?
作为批处理作业的一部分,我想通过scp复制文件,接收服务器当然需要密码,不,我不能轻易地将其更改为基于密钥的身份验证。
Answers:
使用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
apt-get install sshpass
yum -y install sshpass
sshpass -f
passwdfile` scp . This way, the password won't show up in
ps`清单等,您可以使用文件权限保护密码。
只需生成一个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
ssh-copy-id -i ~/.ssh/id_rsa.pub <remote_server>
该密钥在远程服务器上复制密钥
curl可以替代scp复制文件,并且它在命令行上支持密码。
curl --insecure --user username:password -T /path/to/sourcefile sftp://desthost/path/
scp
必须等待30秒钟以上才能让我输入密码,但curl
立即可以使用。
这是使用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#pscp
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的示例:将简单的shell升级为完全交互式的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
一种替代方法是将用户密钥的公共一半添加到目标系统上的授权密钥文件中。在要从其发起传输的系统上,可以运行ssh-agent守护程序并将密钥的私有一半添加到代理。然后可以将批处理作业配置为使用代理获取私钥,而不是提示输入密钥的密码。
这应该在UNIX / Linux系统上或在使用Pageant和pscp的Windows平台上都可行。
仅当您安装了该应用程序或您应该具有管理员权限才能安装上述所有解决方案,或者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/
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
我发现这个答案很有帮助 这里。
rsync -r -v --progress -e ssh user@remote-system:/address/to/remote/file /home/user/
您不仅可以在此处传递密码,而且在复制时还会显示进度条。非常棒。