【问题标题】:Embedding the Password in the Bash Script在 Bash 脚本中嵌入密码
【发布时间】:2023-03-07 02:42:01
【问题描述】:

我正在运行一个测试脚本,其中需要将文件复制到目标嵌入式系统。但是当从脚本运行将文件复制到远程目标系统的命令时,系统提示我输入目标板的管理员密码。如何自动化脚本,使脚本自己(从脚本中)选择密码,而我不必每次运行脚本时手动输入密码。

脚本的片段形式如下:

scp test.file1 <Target ip-address>:/home/bot21/test/.

Password is prompted when the above command is run.

【问题讨论】:

  • scp 在后台使用 SSH 协议。如果您可以在没有密码的情况下通过 SSH 连接到该服务器,它将无需提示即可工作。查看 SSH 密钥和 ssh-agent。

标签: linux bash shell scp


【解决方案1】:

您可以使用sshpass 将密码传递给scp。类似的东西

sshpass -p passw0rd scp test.file1 <Target ip-address>:/home/bot21/test/

但如前所述,建议使用键。在 SO 文档退役之前,我在 SO 文档中添加了以下注释。


使用密码从脚本连接

当您确实需要编写ssh 连接脚本时,将密码传送到ssh 命令不起作用(echo passw0rd | ssh host)。这是因为密码不是从标准输入读取的,而是直接从 TTY(电传打印机、电传打字机、电传打字机,出于历史原因)读取的。

但是有sshpass 工具可以解决这个问题。它可以从参数、文件或环境变量中读取密码。但请注意,这些选项都不能满足密码的安全要求!

$ sshpass -p passw0rd ssh host
$ sshpass -f /secret/filename ssh host
$ SSHPASS=passw0rd sshpass -e ssh host

ps 中的其他用户可以看到命令行选项(在运行时它被屏蔽,但在启动时不是,你不能依赖它):

... 23624  6216 pts/5    Ss   Aug30   0:00  \_ /bin/bash
... 12812  1988 pts/5    S+   08:50   0:00  |   \_ sshpass -p passw0rd ssh host
... 45008  5796 pts/15   Ss+  08:50   0:00  |       \_ ssh host

请注意,系统上的其他进程也可以使用/proc/PID/environ 文件访问进程的环境变量。

最后,将密码存储在文件中可能看起来是最好的主意,但仍然使用其他示例中描述的密钥是使用ssh 的首选方式。

【讨论】:

    【解决方案2】:

    正确的方法是使用基于密钥的身份验证。 Read about it here

    如果该链接断开,只需用谷歌搜索:“ssh passwordless”或“ssh key authentication”。尽管有 Toby 的评论,但我认为链接到或指导如何自己搜索比重复别人可以说得更好、比我更深入的内容要好。

    【讨论】:

    • 虽然理论上这可以回答这个问题,it would be preferable 在这里包含答案的基本部分,并提供链接以供参考。
    【解决方案3】:

    使用-i 选项。手册页说:

    -i 身份文件
    选择要公开身份(私钥)的文件 密钥认证被读取。该选项直接传递给 ssh(1).

    就是这样:

    scp -i /path/to/identity_file test.file1 <Target ip-address>:/home/bot21/test/
    

    创建身份文件的过程很好描述[ here ]

    身份文件的访问权限应配置为系统中可能访问此文件的潜在用户应该能够读取它。另请注意,这些用户应该能够遍历路径,即我们示例中的 /path/to 以访问文件

    【讨论】:

      猜你喜欢
      • 2012-05-17
      • 2014-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-07
      • 2018-12-30
      • 2021-07-19
      相关资源
      最近更新 更多