我是 bash 新手,正在编写一个 bash 脚本,用于在两台计算机之间传输文件。顺便问一下,有没有比 scp 更安全的替代方案?
目前,我使用 scp 手动执行此操作。远程服务器总是提示我输入密码,然后我输入密码。我想自动执行此操作(因此使用 bash 脚本)。但是,我不想以纯文本形式提供我的密码(或者根本不想提供 - 我的印象是开放 SSL 取消了密码并使用证书等?)。
谁能解释一下如何自动化我当前的流程,而不明确显示我的密码。
我在 Ubuntu 10.0.4 上运行
答案1
要不使用密码登录,您需要设置基于密钥的身份验证。有许多教程可供参考 -这看起来是个不错的起点(编辑:原始网站已从互联网上消失,此链接指向 WayBackMachine 存档的最后一份副本)。
如果您在密钥上设置了密码(推荐),您仍然需要在登录时提供密码,但您可以使用 ssh-agent 来减少必须提供密码的次数。
如果您需要使用 SSH/SCP 无人值守运行的脚本,那么您的密钥上就不需要有密码,但在这种情况下,您绝对必须保证该密钥文件的安全,以便其他任何人都无法读取它,否则他们将能够在该服务器上以您的身份进行身份验证,而无需任何密码/密码。
答案2
为 scp 提供密码
将您的密码传输到 scp 的标准输入不起作用:
echo "password" | scp file user@host:/dir/to/copy/to
因为出于安全原因, scp 不会从标准输入读取。
改用工具 sshpass:
由于 sshpass 不是标准的,因此您可能必须以 root 身份安装 sshpass。
sshpass -p 'mypassword' scp -r [email protected]:/home/a/moo.txt /home/b/bar.txt
答案3
如果你使用 .pem 等密钥(这样你就不需要密码了),你可以使用这个
这是带有 .pem 密钥文件的 SCP bash 代码。只需将其保存到 script.sh 文件中,然后使用“sh script.sh”运行即可
享受
#!/bin/bash
#Error function
function die(){
echo "$1"
exit 1
}
Host=ec2-53-298-45-63.us-west-1.compute.amazonaws.com
User=ubuntu
#Directory at sent destination
SendDirectory=scp
#File to send at host
FileName=filetosend.txt
#Key file
Key=MyKeyFile.pem
echo "Aperture in Process...";
scp -i $Key $FileName $User@$Host:$SendDirectory || \
die "@@@@@@@Houston we have problem"
echo "########Aperture Complete#########";