Eu uso o OS X e uma chave SSH privada armazenada em um Yubikey para SSH para servidores remotos. Cada vez que meu Mac dorme e acorda, preciso executar o gpg-connect-agent updatestartuptty /bye
.Esta respostadisse que posso colocar este comando ~/.ssh/config
assim
Match host * exec "gpg-connect-agent updatestartuptty /bye"
Mas isso não funciona porque preciso definir o GPG_TTY
env var no contexto disso exec
para o valor do meu shell atual tty
. Eu uso casca de peixe e tenho isso em~/.config/fish/config.fish
set -x GPG_TTY (tty)
Mas quando o ssh exec
é executado, tty retorna not a tty
. Estes são todos os meus ambientes.
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
Como posso Match host * exec ...
herdar o tty? Ou existe uma maneira melhor de fazer o OS X funcionar com Yubikey + SSH após dormir/acordar?
Responder1
De acordo comCódigo-fonte OpenSSH, os comandos invocados para o recurso "Match exec" terão suas entradas e saídas padrão conectadas a /dev/null. O erro padrão, entretanto, é deixado de lado. Se você executar ssh
a partir de um TTY, o erro padrão do comando exec ainda deverá ser o TTY.
O tty
comando informa sobre o TTY conectado à sua entrada padrão. Você poderia usar o redirecionamento de linha de comando para conectar o tty
stderr do comando ao seu stdin. Não sou um fish
usuário, mas bash
por exemplo você executaria algo assim:
tty <&2