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

Tai*_*ieb 6 command-line bash scripts password scp

我创建了一个 bash 脚本,运行它时有时需要我输入一些信息(其他机器密码/用户名)。

有没有办法通过在代码中输入(硬编码)这​​些信息来防止这种情况发生?这样当我执行它时,它会顺利运行,而无需我输入任何内容。

这是命令:

scp /home/machine1/backup/test.txt /home/machine2/backup
Run Code Online (Sandbox Code Playgroud)

我不想输入 machine2 密码,而是想在我的脚本中对其进行硬编码。

sud*_*dus 13

SSH密钥认证方便安全

请不要将密码硬编码到 shellscript 中,因为其他人很容易阅读它。

  • 登录与密钥认证ssh是你所需要的。

    这样你就不需要密码,而且也更安全。如果计算机在 Internet 上可见,这一点尤其重要。如果您认为这不重要,请尝试记录下一周的登录尝试次数。

    • 跑步

      ssh-keygen
      
      Run Code Online (Sandbox Code Playgroud)

      您可能会被要求使用密码保护密钥

    • 不要这样做 (在ssh-keygen询问时按 Enter 以在没有密码的情况下继续),因为您不想在运行脚本并到达scp命令行时输入任何密码或密码。

      如果没有密钥身份验证和明文密码,对 shellscript 拥有严格的权限非常重要,这对于没有明文密码的安全相关 shellscript 也是一个好主意。脚本文件的默认权限(在您的主目录中的某处创建时)可能是644

      $ ls -l shellscript 
      -rw-r--r-- 1 sudodus sudodus 349 dec 23 10:54 shellscript
      
      Run Code Online (Sandbox Code Playgroud)

      您可以为每个人授予脚本文件执行权限, 755

      $ chmod 755 shellscript
      $ ls -l shellscript 
      -rwxr-xr-x 1 sudodus sudodus 349 dec 23 10:54 shellscript
      
      Run Code Online (Sandbox Code Playgroud)

      但你最好把它剪成600,除了你自己的用户 ID 没有任何权限,而且根本没有执行权限

      $ chmod 600 shellscript 
      $ ls -l shellscript
      -rw------- 1 sudodus sudodus 349 dec 23 10:54 shellscript
      
      Run Code Online (Sandbox Code Playgroud)

      并且您不能直接使用 运行它./shellscript,因此请使用

      bash shellscript       # when shellscript in the current directory
      bash path-to-shellscript/shellscript  # from other directories
      
      Run Code Online (Sandbox Code Playgroud)
    • ssh-keygen如果您想要更高的安全性,请执行(在询问时输入密码),因为您的私钥将受到保护(使用密码加密),但是当您使用scp.

    • 您必须复制一个密钥文件,例如

      ssh-copy-id <username>@<host>
      
      Run Code Online (Sandbox Code Playgroud)
    • scp用途ssh进行数据传输。因此,当钥匙就位时,它应该可以在没有密码的情况下工作。



  • 为了两全其美,请为 ssh-keygen 提供密码,然后使用 ssh-agent 解锁您的密钥,您必须提供一次密码,然后您可以在同一会话中多次使用该密钥而无需提供密码。不以交互方式运行脚本时不会这样做,当然,就像在 cron 作业中一样。 (2认同)

小智 1

使用sshpass。在 Ubuntu 中,您可以使用sudo apt install sshpass.

这个通用语法应该可以解决问题:

sshpass -p<password> <source> <destination>
Run Code Online (Sandbox Code Playgroud)

但这并不安全。我们不要将便利性置于基本安全之上。系统上的任何其他用户都可以看到其他用户正在运行的命令和参数。为了防止这种情况,您可以读取sshpass环境变量。

export SSHPASS=<password>
sshpass -e scp <source> <destination>
Run Code Online (Sandbox Code Playgroud)

如果脚本中的unset SSHPASS其他内容不可信,我还建议运行。

  • -p 选项应该被认为是所有 sshpass 选项中最不安全的。所有系统用户都可以通过简单的“ps”命令在命令行中查看密码。Sshpass 做了最小限度的隐藏密码的尝试,但这种尝试注定会造成竞争条件,而不会真正解决问题。鼓励 sshpass 用户使用其他更安全的密码传递技术之一。 (4认同)

Eri*_*ntz 1

使用 rsa 公钥/私钥对设置对服务器的 ssh 访问。将您的私钥保存在内存中。然后,您可以在没有密码的情况下通过 scp 或 ssh 进入服务器(除了让生活更轻松之外,密钥文件身份验证比密码身份验证更安全)

以下是如何设置 ssh 进行密钥文件身份验证: https://www.digitalocean.com/community/tutorials/how-to-set-up-ssh-keys--2