远程 shell 脚本 输入密码

远程 shell 脚本 输入密码

如何运行脚本来登录远程服务器并执行远程 ssh 命令而无需输入密码?

例如:

当我登录远程服务器并执行git pull命令时,我看到ssh提示我输入密码:

$ git pull origin master
Enter passphrase for /home/v3ed2/.ssh/id_rsa:

输入密码后,我将继续执行命令。

我想运行一个脚本来登录远程服务器并为我运行命令。我已经尝试过这个脚本:

ssh ve "cd clients/ ; git pull"

但是,当脚本运行时,它不会提示我输入密码。该脚本在等待我的密码短语时挂起,但是当我尝试输入密码短语时,出现错误:

bash: line 1: [REDACTED]: command not found    

答案1

当您不带命令运行 ssh 时,它会在服务器端设置一个伪终端并在该终端中运行交互式 shell。当您传递命令时,该命令的输入和输出直接连接到 SSH 通道来执行,没有远程终端。如果您传递该-t选项,则会在远程端创建一个终端,并且您将收到密码提示,您可以在其中键入密码。

ssh -t ve "cd clients/ ; git pull"

然而,这并不是一个方便的方法。便捷的方法是在本地计算机上运行 SSH 代理,并转发该代理的连接。

首先,您需要在第二个连接(到 git 服务器)上使用公钥身份验证,而不是密码身份验证。您已经这样做了,所以我不会详细介绍。

将第二台服务器(在中间计算机上)的私钥复制/home/v3ed2/.ssh/id_rsa到本地计算机。或者,在 git 服务器上,授权您在本地计算机上拥有私钥的公钥。或者,首先运行ssh -t ve ssh-add .ssh/id_rsa以向本地代理注册中间计算机的密钥。

一些发行版和桌面环境已经设置了 SSH 代理。检查您是否有一个正在运行的ssh-add -l.如果这表明您没有运行代理,则需要在会话中启动代理。要么运行ssh-agent your-session-manager而不是your-session-manager直接调用,要么eval $(ssh-agent)在会话启动脚本中运行,或者在 GUI 配置中勾选“运行 SSH 代理”复选框。您需要做两件事:启动ssh-agent程序,并获取SSH_AUTH_SOCK它设置或打印到会话环境中的变量。如何执行此操作的详细信息取决于您的发行版和桌面环境。

在本地运行 SSH 代理后,请确保将其转发。默认情况下可能会也可能不会转发。运行ssh ev ssh-add -l检查代理是否转发。如果不是,请将该行添加ForwardAgent yes到您的本地~/.ssh/config.

如果您在本地使用 PuTTY 运行 Windows,它还附带一个关键代理 Pageant。请参阅腻子手册以获得指示。

ssh-add ~/.ssh/id_rsa当您设置了有效的 SSH 代理时,请使用命令(或私钥的任何路径)在每个会话中向代理注册一次密钥。此后,您可以使用该密钥,而无需在会话的其余部分进行提示。

答案2

这个问题太广泛了,因此有多种变体可以解决这个问题。

第一个是使用没有密码的密钥。从技术上讲,密码是某些加密本地私钥的对称加密算法的密钥。空密码意味着密钥未加密,任何有权读取它的人都可以使用。您可以指示 ssh-keygen 使用空密码-N''生成它时,或稍后使用它进行更改-p(此处的所有选项均适用于 OpenSSH 风格)。这是提供对远程系统的签名自动访问的最流行的方法。通常它与服务器端对密钥的限制相结合(通过IP限制、强制命令、受限shell等)

如果需要,您可以保护加密磁盘上未加密的私钥。

接下来,您可以使用 ssh-agent。它要求用户登录系统,并在运行时将密码缓存在内存中,因此您可以在 X 终端会话(或模拟)期间仅输入一次密码,然后自动登录到远程服务器,而无需重复密码。

接下来,如果客户端和服务器主机属于同一领域,您可以使用 Kerberos,它为远程登录提供自己的会话时间票证。

接下来,您可以使用预计或类似的工具来自动与运行命令的终端进行交互。它的脚本应该侦听密码提示并输入它。但这比这里描述的所有其他方法都要复杂和麻烦得多,并且应该被视为其他方法失败时的最后手段。

这个列表可以继续使用更奇特的方法:)

答案3

我认为您正在寻找的是 SSH 密钥的使用。您需要生成一组密钥(一个是私有密钥,另一个是公共密钥)并将公钥添加到您在远程系统上的帐户。找到密钥后,您将能够远程登录到其他系统,而无需提示输入密码。

查看这些操作方法以了解更多详细信息:

相关内容