如何通过将密码硬编码到脚本中来避免输入 scp 命令的密码?

如何通过将密码硬编码到脚本中来避免输入 scp 命令的密码?

我创建了一个 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-serverapt

    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如果有其他事情我也建议跑步在你的脚本中不值得信任。

相关内容