使用 ssh 代理
我在辦公室有我的桌面。
X
啟動時,自動ssh-agent
啟動。我必須SSH key
在開始時添加我的一次,然後我可以使用ssh
而無需每次都輸入我的密碼。
SSH
但是,當我通過(即從家裡)連接到我的桌面時,ssh-agent
無法訪問,我每次都必須提供我的密鑰。另外,即使我啟動一個新的實例ssh-agent
,我仍然無法連接到它。有沒有辦法
ssh-agent
在遠端系統上使用(我通過ssh
?
您可以使用代理轉發:確保包含
ForwardAgent yes
在您的客戶端配置 (~/.ssh/config
) 中,或使用-A
命令行選項。(可以在伺服器端(AllowAgentForwarding
insshd_config
)禁用此功能,但這僅對無法執行任意 shell 命令的受限帳戶有用。)這樣,本地電腦中的所有密鑰都可以在遠端會話中使用。請注意,在客戶端啟用代理轉發具有安全隱患:它使遠端電腦的管理員可以訪問您的密鑰(例如,如果您在 A 並且擁有 B 的密鑰和 C 的密鑰,並啟用代理轉發在您與 B 的連接中,這讓 B 可以訪問您的密鑰並因此登錄到 C)。如果您想讓辦公室機器上的 X 會話中的代理在家裡的 SSH 會話中可用,那麼您需要將
SSH_AUTH_SOCK
環境變數設置為指向與 X 會話中相同的文件。手動操作很容易:export SSH_AUTH_SOCK=/tmp/ssh-XXXXXXXXXXXX/agent.12345
其中
XXXXXXXXXXXX
是一個隨機字元串,12345
是代理程序的 PID。find /tmp -maxdepth 1 -user $USER -name 'ssh-*'
如果只有一個正在執行的代理(
SSH_AUTH_SOCK
您可以從正在執行的程序中提取 的值。例如,在 Linux 上,如果您的視窗管理器是 Metacity(預設的 Gnome 視窗管理器):env=$(grep -z '^SSH_AUTH_SOCK=' /proc/$(pidof -s metacity)/environ') if [ -n "$env" ]; then export "$env"; fi
或者,您可以將辦公機器配置為使用單個 SSH 代理。如果代理在您登錄時自動啟動,那麼在大多數發行版中,如果環境中已經呼叫了一個變數,它將不會啟動
SSH_AUTH_SOCK
。SSH_AUTH_SOCK
因此,在您的~/.profile
or中添加一個定義,如果它尚未在 中啟動,則~/.pam_environment
手動啟動:ssh-agent``.profile
export SSH_AUTH_SOCK=~/.ssh/$HOSTNAME.agent if [ -z "$(pgrep -U "$USER" ssh-agent)" ]; then ssh-agent >/dev/null fi
在您的遠端外殼中,可以簡單地執行:
ssh-agent bash
這樣,您將獲得一個新的 SSH 代理實例和一個
bash
設置了必要環境變數的新 shell。當您使用exit
或離開 shell 時logout
,SSH 代理也會退出。如果您在直接使用的設備中有相同的可用密鑰,您還可以使用
ssh -A
使新啟動的遠端 shell可以訪問**本地代理。它有一些安全隱患,但如果你在兩台設備上都有可用的密鑰,那就沒有區別了。當您想要連接到現有代理時,您需要設置相關的環境變數,就像在圖形 shell 中設置它們一樣。使用 GUI 會話的自動啟動工具將變數儲存在某處可能會很方便。您可以使用
env
.env | grep SSH
要訪問代理,您基本上只需要
SSH_AUTH_SOCK
. 用於向代理髮送信號,SSH_AGENT_PID
其他 SSH 變數用於輔助工具。您還可以通過 訪問其他程序的環境
/proc/*/environ
。但是,這些項目是 NUL 終止的,而不是 LF 終止的。我相信在這種情況下文件方法更可取。