如何在同一个脚本中使用两个ssh命令然后继续执行其他命令?

如何在同一个脚本中使用两个ssh命令然后继续执行其他命令?

要登录我的数据库,我每次都会遵循以下步骤:

ssh [email protected] 
password: 

连接后,我在同一终端中登录本地数据库服务器:

ssh database_name 
password:

然后我做一个 su :

su - appuser

接下来我实际连接到 sqlplus:

sqlplus ..

我正在尝试使用 unix 脚本自动执行此操作,但我无法弄清楚以下内容:

  1. 如何在同一个脚本中使用 2 个 SSH
  2. 我可以走到“ssh database_name”并输入密码,但随后控制权返回到终端,并且脚本的其余部分不会执行
  3. 我知道在第二次 ssh 之后,我必须传递其余命令,从 su 命令作为参数开始;但我不知道该怎么做。

答案1

我对此的方法有两个方面。一,通过ssh-keygen@Avinash 在评论中提到的方式配置 SSH 的无密码密钥登录。其次,使用expect逐步执行两个 SSH 会话并启动sqlplus,然后将控制权返回给终端。

答案2

像这样的东西,再加上无密码的 pubkey auth 应该可以解决问题:

# create an ssh connection for tunneling only, in the background (this assumes tunneling is allowed... usually is)
ssh -N -L 9999:database_name:22 [email protected] &
pid=$!

# connect to the 2nd machine directly, using the tunnel, also run only the sqlplus command. (this assumes sudo is installed)
ssh -oPort 9999 localhost sudo -u appuser sqlplus ..

kill $pid

第一个命令可以替换为 ~/.ssh/config 中的特殊配置。这是一个例子:

Host mytunnel
    User unix_id
    Hostname something.com
    LocalForward 9999 localhost:22

Host sqlviatunnel
    User unix_id
    Hostname localhost
    Port 9999
    ProxyCommand ssh -q -W %h:%p mytunnel

进而

ssh sqlviatunnel

将 sqlviatunnel 重命名为更短的名称。

相关内容