Re: tmux на локальной машине
>>>>> Artem Chuprina <ran@lasgalen.net> writes:
>>>>> Victor Wagner -> debian-russian@ @ Thu, 13 Jul 2017 22:34:51 +0300:
[…]
>> 1. Придумать удобный, желательно zero-key solution, чтобы при
>> запуске screen там образовывался свой агент со своими ключами, по
>> которым пускают только на гитхаб или тому подобные сайты, куда может
>> понадобится скрипту без человеческого надзора ходить.
Если грубо…
#!/bin/sh
## Usage: $ eval "$(get-agent)"
## Check if SSH_AUTH_SOCK is already set
test -n "$SSH_AUTH_SOCK" \
&& exit
## NOTE that we may decide to REMOVE this file later in this script.
## Getting this one from the environment may have security implications.
export SSH_AUTH_SOCK="$HOME"/.ssh-agent/"$HOSTNAME".socket
## Check if ssh-agent(1) can be interacted with
ssh-add -l > /dev/null
if test "$?" != 2 ; then
## NB: $? should either be 0 (OK) or 1 (command failed; say, due to
## the agent currently representing NO identities) here
printf %s\\n SSH_AUTH_SOCK="'${SSH_AUTH_SOCK//\'/\'\\\'\'}'"
exit
fi
## Move stale socket out of our way
mv -f -- "$SSH_AUTH_SOCK" "${SSH_AUTH_SOCK}.~${RANDOM}~"
## Or we can remove it instead
# rm -f -- "$SSH_AUTH_SOCK"
## Pass control to a newly started agent
exec ssh-agent -a "$SSH_AUTH_SOCK"
>> 2. Придумать способ как сделать, чтобы при реконнекте к screen-у у
>> выполняющихся внутри его сессий процессов появлялся доступ к
>> ssh-ключам той сессии, откуда выполнен реконнект.
>> (похоже тут ничего не придумаешь кроме встраивания в мультиплексор
>> терминалов своего agent-forwarder-а).
> Ко второму у меня есть. Правда, довольно навороченное.
[…]
> zsh% cat ~/etc/bin/ssh
> #!/bin/sh
> [ -n "$STY" ] && [ -f "$HOME/bin/fixssh" ] && . "$HOME/bin/fixssh"
> exec /usr/bin/$(basename $0) "$@"
Откуда такая нелюбовь к содержащим пробелы именам файлов
(в частности: $HOME)?
exec /usr/bin/"${0##*/}" "$@"
> zsh% cat ~/etc/bin/grabssh
> #!/bin/sh
> [ -z "$STY" ] || exit 1
> [ -d $HOME/bin ] || mkdir $HOME/bin
Аналогично. И более того.
[ -d "$HOME"/bin ] || mkdir -- "$HOME"/bin
Вообще говоря, я следую весьма простому правилу: $ в "", кроме
случаев, когда /требуется/ деление на слова.
> SSHVARS="SSH_CLIENT SSH_TTY SSH_AUTH_SOCK SSH_CONNECTION DISPLAY"
> for x in ${SSHVARS} ; do
> (eval echo $x=\$$x) | sed 's/=/="/
> s/$/"/
> s/^/export /'
Bash позволил бы обойтись без eval ("${x}=${!x}"), но, похоже,
POSIX такую подстановку не регламентирует.
… Однако вполне можно обойтись без Sed:
eval echo export "$x"=\\\'\${"$x"//\\\'/\\\'\\\\\\\'\\\'}\\\'
> done 1>$HOME/bin/fixssh
> zsh% cat ~/etc/bin/screen
> #!/bin/sh
> grabssh
> exec /usr/bin/screen "$@"
> Собственно, в ~/bin/fixssh получается
> export SSH_CLIENT="127.0.0.1 43717 22"
> export SSH_TTY="/dev/pts/1"
> export SSH_AUTH_SOCK="/tmp/ssh-7olChLovwG/agent.6998"
> export SSH_CONNECTION="127.0.0.1 43717 127.0.0.1 22"
> export DISPLAY=""
> Подозреваю, что в комплекте с keychain получится и решение первой
> задачи. Мне просто unattended не надо, я и не проверял.
Любопытно, каким образом используются переменные выше, кроме
SSH_AUTH_SOCK и SSH_CONNECTION?
--
FSF associate member #7257 np. Alone — Fox Amoore & Dreamsong B6A0 230E 334A
Reply to: