Ssh
如何使 ~/.ssh/config 匹配主機 * 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
上下文中的 env var設置exec
為我目前 shell 的tty
值。我用fish shell,裡面有這個~/.config/fish/config.fish
set -x GPG_TTY (tty)
但是當 ssh
exec
執行時,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 一起工作?
根據OpenSSH 原始碼,為“Match exec”功能呼叫的命令將其標準輸入和輸出連接到 /dev/null。然而,標準誤差被單獨留下。如果
ssh
從 TTY 執行,則 exec 命令的標準錯誤應該仍然是 TTY。該
tty
命令報告連接到其標準輸入的 TTY。您可以使用命令行重定向將tty
命令的標準錯誤連接到其標準輸入。我不是fish
使用者,但bash
例如你會執行這樣的東西:tty <&2