![如何通过将密码硬编码到脚本中来避免输入 scp 命令的密码?](https://linux22.com/image/1205558/%E5%A6%82%E4%BD%95%E9%80%9A%E8%BF%87%E5%B0%86%E5%AF%86%E7%A0%81%E7%A1%AC%E7%BC%96%E7%A0%81%E5%88%B0%E8%84%9A%E6%9C%AC%E4%B8%AD%E6%9D%A5%E9%81%BF%E5%85%8D%E8%BE%93%E5%85%A5%20scp%20%E5%91%BD%E4%BB%A4%E7%9A%84%E5%AF%86%E7%A0%81%EF%BC%9F.png)
我创建了一个 bash 脚本,有时运行它时需要我输入一些信息(其他机器密码/用户名)。
有没有办法通过在代码中输入(硬编码)此信息来防止这种情况?这样,当我执行它时,它将顺利运行,而无需我输入任何内容。
这是命令:
scp /home/machine1/backup/test.txt /home/machine2/backup
我不需要输入 machine2 密码,而是希望将其硬编码到我的脚本中。
答案1
SSH密钥认证便捷、安全
请不要将密码硬编码到 shellscript 中,因为其他人很容易读取它。
使用以下方式登录密钥认证就是
ssh
您所需要的。这样就不需要密码了,而且也更安全。如果计算机在互联网上可见,这一点尤其重要。如果你认为这不重要,请尝试记录下一周的登录尝试。
跑步
ssh-keygen
你可能会被要求用密码保护密钥。
不要这样做 (当询问时按 Enter 继续而不输入密码
ssh-keygen
),因为您不想在运行脚本并到达scp
命令行时输入任何密码或密码。如果没有密钥认证和明文密码,那么对 shellscript 有严格的权限非常重要,对于没有明文密码的安全相关 shellscript 来说,这也是一个好主意。脚本文件的默认权限(在主目录中创建时)可能是
644
$ ls -l shellscript -rw-r--r-- 1 sudodus sudodus 349 dec 23 10:54 shellscript
并且你可以赋予每个人执行脚本文件的权限,
755
$ chmod 755 shellscript $ ls -l shellscript -rwxr-xr-x 1 sudodus sudodus 349 dec 23 10:54 shellscript
但你最好把它削减到
600
,除了你自己的用户ID之外没有任何权限,而且根本没有执行权限$ chmod 600 shellscript $ ls -l shellscript -rw------- 1 sudodus sudodus 349 dec 23 10:54 shellscript
并且您不能直接使用来运行它
./shellscript
,因此请使用bash shellscript # when shellscript in the current directory bash path-to-shellscript/shellscript # from other directories
行动起来(询问时输入密码
ssh-keygen
)如果您想要更高的安全性,因为您的私钥将受到保护(用密码加密),但是当您运行脚本时,您必须输入密码scp
。您必须复制密钥文件,例如
ssh-copy-id <username>@<host>
scp
用于ssh
数据传输。因此,当密钥到位时,它应该不需要密码就可以工作。
每台 Linux 机器都可以通过在 Ubuntu 中
ssh
安装来成为服务器,openssh-server
apt
sudo apt update sudo apt install openssh-server
链接详细信息,例如故障排除提示,
答案2
使用 rsa 公钥/私钥对设置对服务器的 ssh 访问。将私钥加载到内存中。然后,您可以无需密码通过 scp 或 ssh 进入服务器(除了让生活更轻松之外,密钥文件身份验证比密码身份验证安全得多)
以下是如何设置 ssh 进行密钥文件认证: https://www.digitalocean.com/community/tutorials/how-to-set-up-ssh-keys--2
答案3
使用sshpass
。在 Ubuntu 中,您可以使用 安装它sudo apt install sshpass
。
这个通用语法应该可以解决问题:
sshpass -p<password> <source> <destination>
但这并不安全。我们不要把便利置于基本安全之上。任何系统上的其他用户可以看到其他用户正在运行的命令和参数。为了防止这种情况发生,您可以sshpass
从环境变量中读取。
export SSHPASS=<password>
sshpass -e scp <source> <destination>
unset SSHPASS
如果有其他事情我也建议跑步在你的脚本中不值得信任。