>>>>> Artem Chuprina <r...@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