远程 shell 脚本 输入密码

luk*_*mas 5 password ssh ssh-agent

如何在不输入密码的情况下运行脚本以登录远程服务器并执行远程 ssh 命令?

例如:

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

$ git pull origin master
Enter passphrase for /home/v3ed2/.ssh/id_rsa:
Run Code Online (Sandbox Code Playgroud)

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

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

ssh ve "cd clients/ ; git pull"
Run Code Online (Sandbox Code Playgroud)

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

bash: line 1: [REDACTED]: command not found    
Run Code Online (Sandbox Code Playgroud)

Gil*_*il' 6

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

ssh -t ve "cd clients/ ; git pull"
Run Code Online (Sandbox Code Playgroud)

但是,这不是一种方便的方法。方便的方法是在本地计算机上运行 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查看agent是否转发。如果不是,请将该行添加ForwardAgent yes到您的本地~/.ssh/config.

如果您在本地运行带有 PuTTY 的 Windows,它也带有一个关键代理,Pageant。有关说明,请参阅PuTTY 手册

当您设置了有效的 SSH 代理时,使用命令ssh-add ~/.ssh/id_rsa(或任何私钥的路径)在每个会话中向代理注册一次您的密钥。在此之后,您可以在不提示会话剩余时间的情况下使用该密钥。