SSH 命令,不提示 ssh 密钥保存或取消选项消息

SSH 命令,不提示 ssh 密钥保存或取消选项消息

需要 ssh 命令从 Linux 机器连接另一个 linux 机器并获取特定命令的输出,但应强制建立连接,而不提示任何 ssh 密钥保存、取消。

到目前为止,已尝试使用命令来连接并获取输出,但收到保存公共 ssh 密钥的提示

value=$(ssh -q -P $passwd $userid@$box "head -1 /users/SB1.txt")

答案1

您想要禁用“主机密钥验证”并且需要以下 SSH 选项:

StrictHostKeyChecking no
UserKnownHostsFile /dev/null

如果将它们添加到命令(而不是您的 ssh 配置文件)中,则使用

-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null

在您的示例命令之后-q

答案2

准备(在您的 SSH 客户端用户和盒子上):创建用于公钥身份验证的密钥对

ssh-keygen -N '' -t rsa -f ~/.ssh/id_rsa

准备(手动/交互方式,每个用户/服务器一次):设置公钥身份验证,并接受主机密钥而不询问(这将询问您$userid一次密码):

ssh-copy-id -o "StrictHostKeyChecking = no" $userid@$box

然后运行远程命令而不进行任何交互:

value=$(ssh -o 'BatchMode = yes' $userid@$box "head -1 /users/SB1.txt")

您的 SSH 客户端现在已经知道服务器的 SSH 主机密钥,因为它是在您运行时添加的ssh-copy-id

答案3

这有两个部分。要在没有密码提示的情况下进行连接,假设您想使用密码身份验证(如您的问题所暗示的),您应该使用程序 sshpass。可以通过许多/大多数 Linux 发行版中的包管理器进行安装。从手册页:

sshpass 是一个实用程序,设计用于使用称为“键盘交互”密码身份验证的模式运行 ssh,但以非交互模式运行。

当然,设置 ssh 密钥更好,但如果不使用 ssh 密码,首先不可能将公钥获取到远程系统,除非您有不同的安全通道来执行此操作。鉴于您需要使用密码将密钥放在那里,如果这是一次性的,您也可以使用密码来完成这项工作。

第二部分是,您需要为 StrictHostKeyChecking 设置适当的值,以防止在第一次时提示保存密钥。通常,您可以使用 StrictHostKeyChecking=accept-new。然后 ssh 会自动将新的主机密钥添加到用户已知的主机文件中,而无需提示。

所以一个典型的命令可能是:

value=$(sshpass -p$passwd ssh -q -oStrictHostKeyChecking=accept-new $userid@$box "head -1 /users/SB1.txt")

答案4

你绝对应该不是搞乱主机密钥,这是一个坏主意。

您应该做的是利用 ssh-keygen(1) (请参阅“man ssh-keygen”)并创建公钥和私钥。由于您不需要密码提示,因此无需提供密码。您将在主目录 (~/.ssh) 的 .ssh 目录中找到结果。

接下来:将 ~/.ssh/id_rsa.pub 的内容添加到远程服务器上的 ~/.ssh/authorized_keys 文件中(您可能需要自己制作)。

最后:告诉SSH(sshd)用户可以使用远程密钥进行授权。这可能是默认设置,但我不能完全确定每个 Linux 发行版。查找选项 PubkeyAuthentication 并确保其已启用。

那么这里会发生什么:您仍然会使用相当强的身份验证(您的外部密钥,保存在 ~/.ssh/id_rsa 中)来授权自己,但因为您没有提供密码,所以不会请求任何密码,并且它'将使登录过程“即时”。

但是,在不牺牲任何安全性的情况下(仅源自您的计算机,因为使用该特定帐户的每个人都可以登录到远程服务器,但这应该是显而易见的)。

但再一次:搞乱 StrictHostKeyChecking 是一个坏的想法,而且完全不需要。

相关内容