[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: