1) В вашем скрипте SSH rc (~/.ssh/rc) вы установите символическую ссылку из канонического местоположения на "текущий" SSH_AUTH_SOCK. Вот как я это делаю в bash (содержимое ~/.ssh/rc):
#!/bin/bash
if test "$SSH_AUTH_SOCK" ; then
ln -sf $SSH_AUTH_SOCK ~/.ssh/ssh_auth_sock
fi
(и убедитесь, что chmod 755 ~/.ssh/rc). "Тест" предназначен только для предотвращения отображения ошибки, если вы не запускаете ssh-agent (т.е. вы используете ssh без -A). Вторая половина этой команды устанавливает символическую ссылку в каноническом месте, которая обновляется до "реального" SSH_AUTH_SOCK во время входа в систему. Это не зависит от использования оболочки в ssh или непосредственного вызова команды, также работает с "ssh -t screen -RRD".
Примечание: существование ~/.ssh/rc меняет поведение sshd. Примечательно, что он не будет называть xauth. Смотрите man sshd для получения дополнительной информации, и как это исправить.
Кроме того, вы не должны использовать «-v» с ln, как только он сломает rsync-over-ssh со следующей диагностикой:
$ rsync -n addr.maps.dev.yandex.net: .
protocol version mismatch -- is your shell clean?
(see the rsync man page for an explanation)
rsync error: protocol incompatibility (code 2) at compat.c(173) [Receiver=3.0.7]
2) В вашем .screenrc вам просто нужно переопределить SSH_AUTH_SOCK для канонического местоположения:
setenv SSH_AUTH_SOCK $HOME/.ssh/ssh_auth_sock
Обратите внимание, что вы используете setenv независимо от того, какую оболочку вы используете; Я думаю, что setenv - это экранный синтаксис, а не оболочка.
Решение изначально адаптировано из этого поста, которое не работает, но имеет правильную идею.