Ssh

使用 ssh 代理

  • April 25, 2014

我在辦公室有我的桌面。X啟動時,自動ssh-agent啟動。我必須SSH key在開始時添加我的一次,然後我可以使用ssh而無需每次都輸入我的密碼。

SSH但是,當我通過(即從家裡)連接到我的桌面時,ssh-agent無法訪問,我每次都必須提供我的密鑰。另外,即使我啟動一個新的實例ssh-agent,我仍然無法連接到它。

有沒有辦法ssh-agent在遠端系統上使用(我通過ssh?

您可以使用代理轉發:確保包含ForwardAgent yes在您的客戶端配置 ( ~/.ssh/config) 中,或使用-A命令行選項。(可以在伺服器端(AllowAgentForwardingin sshd_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_SOCKSSH_AUTH_SOCK因此,在您的~/.profileor中添加一個定義,如果它尚未在 中啟動,則~/.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 終止的。我相信在這種情況下文件方法更可取。

引用自:https://unix.stackexchange.com/questions/125818