在Bash脚本中嵌入密码

时间:2016-08-31 06:15:47

标签: linux bash shell scp

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

脚本形式的脚本如下:

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

Password is prompted when the above command is run.

3 个答案:

答案 0 :(得分:2)

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

如果该链接中断,只需谷歌:&#34; ssh无密码&#34;或者&#34; ssh密钥认证&#34;。尽管托比的评论,我认为链接或指导如何自己搜索它比重复别人可以更好,更深入地说出来的更好。

答案 1 :(得分:1)

您可以使用sshpass将密码传递给scp。像

这样的东西
sshpass -p passw0rd scp test.file1 <Target ip-address>:/home/bot21/test/

但如前所述,建议使用密钥。我在退休之前向SO文档添加了以下注释。

使用密码

从脚本连接

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

但是有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文件的系统上的其他进程也可以访问进程的environemnet变量。

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

答案 2 :(得分:1)

使用-i选项。 Manpage说:

  

-i identity_file
               选择用于公开的标识(私钥)的文件                读取密钥认证。此选项直接传递给                SSH(1)。

那就是:

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

详细描述了创建身份文件的过程[ here ]

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