我正在编写一个应该启动 serf 代理的 bash 脚本(http://www.serfdom.io/intro/index.html) 通过 ssh 在远程机器上。我已经使用以下方式设置了 rsa 密钥...
ssh-key-gen -t rsa -b 4096
ssh-copy-id -i ~/.ssh/id_rsa.pub <remote-host>
我可以从终端无需密码即可 ssh 到远程计算机。这是我在脚本中进行的调用
ssh <user>@<hostname> "serf agent -node database -event-handler user:database_install=~/serf_install_db_handler.sh"
但是当脚本执行时,我必须使用此命令才能在没有密码提示的情况下运行它......
ssh -i ~/.ssh/id_rsa.pub <remote-host> <command>
为什么我必须在脚本中执行此操作,而不需要在终端中执行此操作?
答案1
ssh -i
选择一个文件,从中读取身份(私钥)或公钥认证。
您可以配置 ssh 以在该主机的配置中使用它,这样您就不必指定它。
添加~/.ssh/config
(替换server.example.com
为您的服务器的主机名或 IP):
Host server.example.com
User username
Hostname server.example.com
PreferredAuthentications publickey,password
IdentityFile ~/.ssh/id_rsa.pub
此配置将使您的连接始终尝试使用 id_rsa.pub 密钥,如果密钥由于某种原因不可用,则回退到密码。
所以现在您应该能够使用ssh <user>@<host> <command>
您的私钥自动进行身份验证。
答案2
您是否尝试过在系统启动时使用 ssh-add?
ssh-add — 将私钥身份添加到身份验证代理
您可以使用此命令,默认情况下,连接时 ssh 将尝试使用您的私钥,然后才使用密码。