如何在不输入密码的情况下运行脚本登录到远程服务器并执行远程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 发布于 2012-12-22 14:32:01
当您在没有命令的情况下运行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配置中勾选“run代理”复选框。您需要做两件事:启动ssh-agent程序,并获取它设置或打印到会话环境中的SSH_AUTH_SOCK变量。如何做到这一点的细节非常特定于您的发行版和桌面环境。
使SSH代理在本地运行后,请确保它已被转发。默认情况下,它可能被转发,也可能不被转发。运行ssh ev ssh-add -l以检查代理是否已被转发。如果不是,将行ForwardAgent yes添加到本地~/.ssh/config中。
如果您在本地运行PuTTY,它还附带了一个关键代理,Pageant。有关说明,请参见腻子手册。
当您有一个工作的SSH代理设置,注册您的密钥(S)与代理每会话一次,使用命令ssh-add ~/.ssh/id_rsa (或任何路径的私钥是)。在此之后,您可以在会话的其余部分使用没有提示的键。
发布于 2012-12-22 06:18:33
这个问题太宽泛了,所以有多个变体来解决这个问题。
第一种方法是使用没有密码的密钥。从技术上讲,密码是对称加密算法中的一个密钥,它是一个本地私钥的加密算法。空密码表示密钥不是加密的,任何有权读取的人都可以使用。您可以指示ssh-keygen在生成它时使用带有-N‘的空密码,或者在以后使用-p更改它(这里的所有选项都是针对OpenSSH风格的)。这是提供对远程系统的签名自动访问的最流行方法。通常,它与服务器端对密钥的限制(通过IP、强制命令、受限shell等)结合在一起。
如果需要,您可以在加密磁盘上保护未加密的私钥。
接下来,您可以使用ssh-agent。它要求用户登录到系统上,并在运行时将密码缓存在其内存中,因此您只能在X终端会话(或模拟)期间输入一次密码,然后自动登录到远程服务器,而无需重复密码短语。
接下来,如果客户机和服务器主机都属于同一个领域,则可以使用Kerberos为远程登录提供自己的会话时间票据。
接下来,您可以使用expect或类似的工具来自动化与运行命令的终端的交互。它的脚本应该侦听密码提示并输入它。但是,这比这里描述的所有其他方法复杂和繁琐得多,当其他方法失败时,应将其视为最后的手段。
这个列表可以用更奇异的方法继续下去:)
发布于 2012-12-22 05:37:15
我想你要找的是SSH密钥的使用。您需要生成一组密钥(一个是私有的,另一个是公共的),并将公钥添加到远程系统上的帐户中。一旦您有了密钥,您就可以远程登录到另一个系统,而无需提示输入密码。
有关更多细节,请查看以下操作:
https://unix.stackexchange.com/questions/59173
复制相似问题