使用预先存在的连接转发非交互式SSH GPG代理

时间:2018-01-27 18:21:12

标签: bash ssh zsh expect gnupg

我这里有一点鸡蛋问题。

问题

我想通过SSH连接到远程计算机并转发我的本地gpg-agent。问题是远程计算机上的gpg-agent仅在建立SSH连接后才启动。虽然gpg-agent没有在远程计算机上运行,​​但在指定转发时我无法通过SSH连接到远程计算机。

鉴于此,此命令不起作用,因为远程gpg-agent未运行,因此 /run/user/1000/gnupg/S.gpg-agent 不会还存在。

ssh -R /run/user/1000/gnupg/S.gpg-agent:/run/user/1000/gnupg/S.gpg-agent user@remotemachine

解决方法

另一种方法是以交互方式/手动方式,如下所示。

ssh user@remotemachine

我现在通过SSH连接,作为副作用,gpg-agent也自动启动了。

当我现在更新现有的SSH连接时,打开SSH PTY:

[enter]
~C
ssh> -R /run/user/1000/gnupg/S.gpg-agent:/run/user/1000/gnupg/S.gpg-agent
Forwarding port.
[enter]

我现在可以通过使用我的本地gpg-agent在远程计算机上运行我的GPG命令。

目标

我想自动完成上述解决方法。基本上我想用ssh user@remotemachine通过SSH连接到远程计算机,然后远程计算机会自动将SSH转发添加到现有的SSH连接。

问题

如何让远程计算机自动更新新建立的SSH连接并添加gpg-agent转发?

1 个答案:

答案 0 :(得分:1)

由于您使用了expect标记,因此这是一个简单的expect脚本,应该足够了。

#!/usr/bin/expect -f
spawn ssh user@remotemachine
expect {$ }
send "date\r"
expect {$ }
send "~C"
expect "ssh> "
send -- "-R /run/user/1000/gnupg/S.gpg-agent:/run/user/1000/gnupg/S.gpg-agent\r"
expect -timeout 5  timeout exit   "\r\n"
send "echo ok\r"
expect "\nok\r"
expect {$ }
interact

将此文件放入文件中并对其执行chmod +x。出于某种原因,我发现我没有收到Forwarding port命令中的-R消息,除非我启用ssh -v,所以我只检查\r\n,但您可以更改这个。另外,我假设来自远程的shell提示符为$,因此您可能也需要更改它,但如果您的提示符为[enter],那么您需要说

expect -ex {[enter]}

以避免将字符串解释为正则表达式。