如何使 ~/.ssh/config 匹配 host * exec 繼承目前 shell 的 tty 名稱?

如何使 ~/.ssh/config 匹配 host * exec 繼承目前 shell 的 tty 名稱?

我使用 OS X 和儲存在 Yubikey 中的 SSH 私鑰透過 SSH 連接到遠端伺服器。每次我的 Mac 睡眠和喚醒後,我都需要運行gpg-connect-agent updatestartuptty /bye.這個答案~/.ssh/config說我可以像這樣輸入這個指令

Match host * exec "gpg-connect-agent updatestartuptty /bye"

但這不起作用,因為我需要將GPG_TTY上下文中的環境變數設定exec為目前 shell 的tty值。我用魚殼,把這個放進去~/.config/fish/config.fish

set -x GPG_TTY (tty)

但是當 sshexec運行時, tty 返回not a tty。這些都是我的環境變數。

cat ~/.ssh/config

...
Match host * exec "env > /tmp/t"
...

[run ssh some-host command]

cat /tmp/t

PWD=/Users/dxia
COLORFGBG=12;8
LC_TERMINAL=iTerm2
LOGNAME=dxia
GPG_TTY=not a tty
LANG=en_US.UTF-8
XPC_FLAGS=0x0
TERM=xterm-256color
TMPDIR=/var/folders/x1/f9sjnv7j43z73sdv5lsk3r8h0000gp/T/
EDITOR=/usr/bin/vim
COLORTERM=truecolor
LC_TERMINAL_VERSION=3.4.10
XPC_SERVICE_NAME=0
__CF_USER_TEXT_ENCODING=0x1F6:0x0:0x0
HOME=/Users/dxia
ITERM_PROFILE=Default
TERM_PROGRAM=iTerm.app
TERM_PROGRAM_VERSION=3.4.10
DISPLAY=/private/tmp/com.apple.launchd.6iiZkY4Tos/org.xquartz:0
USER=dxia
SHLVL=1
COMMAND_MODE=unix2003
TERM_SESSION_ID=w0t0p1:5945A63C-850F-4DCF-A605-F72860D9D72C
__CFBundleIdentifier=com.googlecode.iterm2
SHELL=/usr/local/bin/fish
ITERM_SESSION_ID=w0t0p1:5945A63C-850F-4DCF-A605-F72860D9D72C
PATH=/opt/homebrew/sbin:/opt/homebrew/bin:/Users/dxia/.pyenv/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/usr/local/sbin:/usr/local/opt/fzf/bin:/opt/homebrew/opt/fzf/bin:/Users/dxia/.jenv/shims:/Users/dxia/.jenv/shims:/Users/dxia/.rbenv/shims:/Users/dxia/google-cloud-sdk/bin
SSH_AUTH_SOCK=/Users/dxia/.gnupg/S.gpg-agent.ssh

我怎麼能Match host * exec ...繼承tty?或者有沒有更好的方法讓 OS X 在睡眠/喚醒後與 Yubikey + SSH 一起工作?

答案1

根據OpenSSH 原始碼,為「Match exec」功能呼叫的命令將其標準輸入和輸出連接到 /dev/null。然而,標準錯誤卻被保留了下來。如果ssh從 TTY運行,exec 指令的標準錯誤仍應是 TTY。

tty命令報告連接到其標準輸入的 TTY。您可以使用命令列重定向將tty命令的 stderr 連接到其 stdin。我不是fish用戶,但bash例如,您會執行以下命令:

tty <&2

相關內容