我正在运行一个测试脚本,其中需要将文件复制到目标嵌入式系统。但是当从脚本运行将文件复制到远程目标系统的命令时,系统会提示我输入目标板的管理员密码。如何自动化脚本,使脚本自己选择密码(从脚本中),并且每次运行脚本时都不必手动输入密码。
脚本形式的脚本如下:
scp test.file1 <Target ip-address>:/home/bot21/test/.
Password is prompted when the above command is run.
答案 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
以到达文件