SSH keys (簡體中文)
SSH 密鑰對可以讓您方便的登錄到 SSH 服務器,而無需輸入密碼。由於您無需發送您的密碼到網絡中,SSH 密鑰對被認為是更加安全的方式。再加上使用密碼短語 (passphrase) 的使用,安全性會更上一層樓。
同時,我們可以使用 SSH agent 來幫助我們記住密碼短語,無需我們記住每一個密鑰對的密碼短語,減輕了我們的負擔。
本文將為您介紹如何管理密鑰對,以方便的連接到您的 SSH 服務器。本文默認您已經熟知 Secure Shell (簡體中文),並安裝好位於官方軟件倉庫 的 openssh。
Contents
[hide]背景
SSH 密鑰對總是成雙出現的,一把公鑰,一把私鑰。公鑰可以自由的放在您所需要連接的 SSH 服務器上,而私鑰必須穩妥的保管好。
所謂"公鑰登錄",原理很簡單,就是用戶將自己的公鑰儲存在遠程主機上。登錄的時候,遠程主機會向用戶發送一段隨機字符串,用戶用自己的私鑰加密后,再發回來。遠程主機用事先儲存的公鑰進行解密,如果成功,就證明用戶是可信的,直接允許登錄 shell,不再要求密碼。這樣子,我們即可保證了整個登錄過程的安全,也不會受到中間人攻擊。
生成密鑰對
我們可以使用 ssh-keygen
命令生成密鑰對
$ ssh-keygen -t ecdsa -b 521 -C "$(whoami)@$(hostname)-$(date -I)"
Generating public/private ecdsa key pair. Enter file in which to save the key (/home/username/.ssh/id_ecdsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/username/.ssh/id_ecdsa. Your public key has been saved in /home/username/.ssh/id_ecdsa.pub. The key fingerprint is: dd:15:ee:24:20:14:11:01:b8:72:a2:0f:99:4c:79:7f username@localhost-2011-12-22 The key's randomart image is: +--[ECDSA 521]---+ | ..oB=. . | | . . . . . | | . . . + | | oo.o . . = | |o+.+. S . . . | |=. . E | | o . | | . | | | +-----------------+
在上面這個例子中,ssh-keygen
生成了一對長度為 521 bit (-b 521
) 的 ECDSA (-t ecdsa
) 加密的密鑰對,comment 為 -C "$(whoami)@$(hostname)-$(date -I)"
。而 randomart image 是 OpenSSH 5.1 引入的一種簡單的識別指紋 (fingerprint) 的圖像。
選擇合適的加密方式
橢圓曲線數字簽名算法 (ECDSA) 生成的密鑰更小,安全性更高。OpenSSH 5.7 建議默認使用 ECDSA,詳情參見 OpenSSH 5.7 Release Notes。較舊的 OpenSSH 版本可能不支持 ECDSA 密鑰,需要注意。而一些廠商因專利問題,暫未提供 ECDSA 的實現。
如果您要生成 RSA (768-16384 bit) 或者 DSA (1024 bit) 密鑰對,需要使用 -t rsa
或者 -t dsa
,並修改 -b
選項。-b
可以省略,ssh-keygen
會生成一個默認大小的密鑰對。
選擇密鑰存儲位置以及密碼短語
輸入 ssh-keygen
時,它會詢問您將密鑰對保存到何處,文件名如何命令等。默認情況下,密鑰對保存到 ~/.ssh
下,文件名則根據加密類型自動命名為 id_ecdsa
(私鑰),id_ecdsa.pud
(公鑰)。建議您采用默認的存儲位置和文件名。
而在 ssh-keygen
請求您輸入一個密碼短語時,您應該輸入一些難以猜到的短語。如果短語足夠隨機和復雜,則私鑰落入賊人之手時就不會容易被破解掉。
當然,您也可以不輸入任何密碼短語,也能夠生成所需的密鑰對。雖然這用起來挺方便的,但是您應該知道這會很危險。在沒有輸入密碼短語的情況下,您的私鑰未經加密就存儲在您的硬盤上,任何人拿到您的私鑰都可以隨意的訪問對應的 SSH 服務器。還有一種情況,如果您不是 root
用戶,則該機器上的 root
用戶可以完全擁有您的密鑰對,因為他的權限是最大的。
不修改密鑰對的情況下修改密碼短語
您可以使用 ssh-keygen
命令來修改密碼短語,而無需改動密鑰對。假設您要修改的密鑰對使用 RSA 加密,輸入以下命令即可:
$ ssh-keygen -f ~/.ssh/id_rsa -p
管理多組密鑰對
您可以創建 ~/.ssh/config
來管理多組密鑰對,每一個 SSH 服務器對應一組密鑰對。或者,您甚至可以對所有的 SSH 服務器使用同一組密鑰對。不過如果您覺得這樣不合適,還是編輯配置文件:
~/.ssh/config
Host SERVERNAME1 IdentitiesOnly yes IdentityFile ~/.ssh/id_rsa_SERVER1 # CheckHostIP yes # Port 22 Host SERVERNAME2 IdentitiesOnly yes IdentityFile ~/.ssh/id_rsa_SERVER2 # CheckHostIP no # Port 2177 ControlMaster auto ControlPath /tmp/%r@%h:%p
更多選項幫助請參考
$ man ssh_config 5
將公鑰復制到遠程服務器上
創建好密鑰對之后,您需要將公鑰上傳到遠程服務器上,以便用於 SSH 密鑰認證登錄。公鑰文件名和私鑰文件名相同,只不過公鑰文件帶有擴展名 .pub
而私鑰文件名則沒有。千萬不要將私鑰上傳,私鑰應該保存在本地。
簡單的方法
$ cat ~/.ssh/id_ecdsa.pub >> ~/.ssh/authorized_keys
如果您的私鑰文件為 ~/.ssh/id_rsa.pub
,您只需要輸入命令
$ ssh-copy-id remote-server.org
如果您的遠程服務器用戶名與本地的不同,您需要指明用戶名
$ ssh-copy-id username@remote-server.org
如果您的私鑰文件名不是默認的,您會得到錯誤 /usr/bin/ssh-copy-id: ERROR: No identities found
。這種情況下,您需要修改命令為
$ ssh-copy-id -i ~/.ssh/id_ecdsa.pub username@remote-server.org
如果遠程服務器監聽端口不是 22,您也需要指明端口
$ ssh-copy-id -i ~/.ssh/id_ecdsa.pub -p 221 username@remote-server.org
傳統的方法
使用命令
$ scp ~/.ssh/id_ecdsa.pub username@remote-server.org:
將公鑰上傳到服務器。注意,該命令最末的 :
不可省略。上傳成功之后,先使用口令登錄到服務器,將公鑰文件重命名為 authorized_keys
,並移動到 ~/.ssh
下,若 ~/.ssh
不存在則新建一個。
$ ssh username@remote-server.org username@remote-server.org's password: $ mkdir ~/.ssh $ cat ~/id_ecdsa.pub >> ~/.ssh/authorized_keys $ rm ~/id_ecdsa.pub $ chmod 600 ~/.ssh/authorized_keys
上面最后兩個命令移除服務器上的公鑰,並設置 authorized_keys
的權限為只有您,也即文件擁有者,有讀寫權限。
安全性
為了保證安全,您應該阻止其他用戶添加新的公鑰。
將 authorized_keys
的權限設置為對擁有者只讀,其他用戶沒有任何權限:
$ chmod 400 ~/.ssh/authorized_keys
為保證 authorized_keys
的權限不會被改掉,您還需要設置該文件的 immutable 位權限:
# chattr +i ~/.ssh/authorized_keys
然而,用戶還可以重命名 ~/.ssh
,然后新建新的 ~/.ssh
目錄和 authorized_keys
文件。要避免這種情況,您需要設置 ~./ssh
的 immutable 位權限:
# chattr +i ~/.ssh
authorized_keys
的 immutable 位權限。然后,添加好新的公鑰之后,按照上述步驟重新加上 immutable 位權限。
禁用密碼登錄
將公鑰上傳到 SSH 服務器上之后,您就不再需要輸入 SSH 賬戶密碼來登錄了。直接使用賬戶密碼登錄容易受到暴力破解的攻擊。倘若您沒有提供 SSH 私鑰,默認情況下,SSH 服務器就會讓您直接使用密碼登錄,這就有可能讓不法之徒來猜測您的密碼,有一定的安全隱患。要禁用這一行為,您需要編輯 SSH 服務器上的 /etc/ssh/sshd_config
:
/etc/ssh/sshd_config
PasswordAuthentication no ChallengeResponseAuthentication no
雙因素認證與公鑰
從 OpenSSH 6.2 開始,您可以使用 AuthenticationMethods
選項來自己添加工具鏈進行認證。這樣就可以配合公鑰使用雙因素認證了。
谷歌身份驗證器設置請參考 Google Authenticator。
如果您使用 PAM (Pluggable Authentication Module,插入式驗證模塊),編輯下面這幾行:
/etc/ssh/sshd_config
ChallengeResponseAuthentication yes AuthenticationMethods publickey,keyboard-interactive:pam
/etc/pam.d/sshd
#%PAM-1.0 auth required pam_google_authenticator.so
如果您設置 PAM 僅使用 pam_google_authenticator.so
,則 sshd
則會采用雙因素認證,而無需密碼。如果雙因素認證失敗,即使有有效的公鑰,sshd 也不允許登錄。您可以加上 nullok
選項來允許用戶使用公鑰登錄:
/etc/pam.d/sshd
#%PAM-1.0 auth required pam_google_authenticator.so nullok
SSH agents
如果您的私鑰使用密碼短語來加密了的話,每一次使用 SSH 密鑰對進行登錄的時候,您都必須輸入正確的密碼短語。
而 SSH agent 程序能夠將您的已解密的私鑰緩存起來,在需要的時候提供給您的 SSH 客戶端。這樣子,您就只需要將私鑰加入 SSH agent 緩存的時候輸入一次密碼短語就可以了。這為您經常使用 SSH 連接提供了不少便利。
SSH agent 一般會設置成在登錄會話的時候自動啟動,並在整個會話中保持運行。有不少的 SSH agent 供您選擇,我們將為您介紹幾種常用的 SSH agent,您可以根據您的需要進行選擇。
ssh-agent
ssh-agent 是 OpenSSH 自帶的一個 SSH agent,它可以直接作為 SSH agent 來使用,或者作為其他 SSH agent 的后端。ssh-agent
運行時會自動 fork 它自身,然收打印出其所需的環境變量。
$ ssh-agent SSH_AUTH_SOCK=/tmp/ssh-vEGjCM2147/agent.2147; export SSH_AUTH_SOCK; SSH_AGENT_PID=2148; export SSH_AGENT_PID; echo Agent pid 2148;
要使用這些環境變量,您需要使用 eval
命令來運行它
$ eval $(ssh-agent) Agent pid 2157
您可以將上述命令添加到 ~/.bash_profile
,以便您啟動 登錄外殼 的時候它自動運行。
$ echo 'eval $(ssh-agent)' >> ~/.bash_profile
如果您想要所有的用戶都可以使用 ssh-agent
,可以直接把上述命令加入到 /etc/profile
。
# echo 'eval $(ssh-agent)' >> /etc/profile
ssh-agent
運行起來之后,您還需要將您的私鑰加入它的緩存。
$ ssh-add ~/.ssh/id_ecdsa Enter passphrase for /home/user/.ssh/id_ecdsa: Identity added: /home/user/.ssh/id_ecdsa (/home/user/.ssh/id_ecdsa)
如果您想要在登錄 shell 的時候自動添加您的私鑰到 ssh-agent
的緩存,您需要在 ~/.bash_profile
加入以下命令:
ssh-add
如果您的私鑰已用密碼短語加密,ssh-add
會提示您輸入密碼短語。輸入爭取的密碼短語之后,您在*當前會話*中就不需要再次輸入密碼短語就能夠使用密鑰對進行 SSH 登錄了。
如果您想要在用到私鑰的時候再輸入密碼短語,您可以添加以下命令到 ~/.bashrc
:
$ ssh-add -l >/dev/null || alias ssh='ssh-add -l >/dev/null || ssh-add && unalias ssh; ssh'
但是這樣做有個缺點,每次啟動 登錄外殼 都會產生一個 ssh-agent
實例,並在會話期間一直運行。不久之后,您的系統中就會有多個根本不再需要的 ssh-agent
進程在運行。稍后,我們將為您介紹其他 ssh-agent
前端,它們能夠避免這個問題。
ssh-agent 作為包裝程序運行
根據加州大學伯克利分校實驗室的這份 ssh-agent 教程,還有一個隨 X 會話啟動 ssh-agent
的方法,該法用於您在使用命令 startx
啟動 X的時候,可以在命令前加上 ssh-agent
:
$ ssh-agent startx
您也可以在 .bash_aliases
中設置別名以方便使用:
alias startx='ssh-agent startx'
這樣做可以避免多個會話中存在多余的 ssh-agent
進程,實際上,整個 X 會話中只有一個 ssh-agent
在運行了。
GnuPG
GnuPG 可以從 官方軟件倉庫 安裝 gnupg。如果您已經在使用 GnuPG,您也許想要 GnuPG 來緩存您的私鑰。當然咯,有些用戶比較喜歡在 GnuPG 對話框來輸入 PIN 碼,這樣子管理密碼短語也是不錯的選擇。
{注意|如果您使用 KDE 作為桌面環境,且安裝了 kde-agent[broken link: package not found] 的話,您只需在 ~/.gnupg/gpg-agent.conf
中設置 enable-ssh-support
。否則,請繼續閱讀。}
要使用 GnuPG agent,您首先要啟動 gpg-agent,並加上 --enable-ssh-support
選項。比如,記得給腳本加上可執行權限:
/etc/profile.d/gpg-agent.sh
#!/bin/sh # Start the GnuPG agent and enable OpenSSH agent emulation gnupginf="${HOME}/.gpg-agent-info" if pgrep -x -u "${USER}" gpg-agent >/dev/null 2>&1; then eval `cat $gnupginf` eval `cut -d= -f1 $gnupginf | xargs echo export` else eval `gpg-agent -s --enable-ssh-support --daemon --write-env-file "$gnupginf"` fi
gpg-agent
運行起來之后,您就可以使用 ssh-add
命令來認證密鑰對,正如上文中 ssh-agent
做的那樣。已認證的密鑰對列表保存在 ~/.gnupg/sshcontrol
文件中。此后,在需要使用您的私鑰密碼短語是,GnuPG 會顯示一個對話框讓您輸入。您可以通過配置文件 ~/.gnupg/gpg-agent.conf
來管理您的密碼短語緩存。比如,下面這個例子說明如何使用 gpg-agent
來緩存您的密鑰 3 小時:
~/.gnupg/gpg-agent.conf
# Cache settings default-cache-ttl 10800 default-cache-ttl-ssh 10800
您還可以在此文件中設置 PIN 輸入框 (GTK、QT 或者 ncurses 版本) 等內容。
gpg-agent.conf
文件,
write-env-file
變量必須設置好,以便允許
gpg-agent
在 SSH 登錄過程中的使用。
~/.gnupg/gpg-agent.conf
# Environment file write-env-file /home/username/.gpg-agent-info # Keyboard control #no-grab # PIN entry program #pinentry-program /usr/bin/pinentry-curses #pinentry-program /usr/bin/pinentry-qt4 #pinentry-program /usr/bin/pinentry-kwallet pinentry-program /usr/bin/pinentry-gtk-2
要使用 gpg-agent
作為 SSH agent,您需要 source & export gpg-agent
寫入 ~/.gpg-agent-info
文件的環境變量,也就是 write-env-file
所指的文件。
~/.bashrc
... if [ -f "${HOME}/.gpg-agent-info" ]; then . "${HOME}/.gpg-agent-info" export GPG_AGENT_INFO export SSH_AUTH_SOCK fi
Keychain
Keychain 是一個用來方便管理 SSH 密鑰對的程序,它能盡最大努力去減少對用戶的打擾。實際上,它就是一個 shell 腳本,驅動 ssh-agent
或者 gpg-add
來工作。一個值得注意的特性是,keychain 在多個會話中重復使用同一個 ssh-agent
進程。這意味着您只需要在機器啟動時輸入一次密碼短語即可。
將下列內容加入到 ~/.bash_profile
:
~/.bash_profile
eval $(keychain --eval --agents ssh -Q --quiet id_ecdsa)
如有需要,請把 id_ecdsa
換成您的私鑰路徑。如果您使用的 shell 不兼容 Bash (簡體中文),請參考 keychain --help
或者 man keychain
。
要測試 keychain 是否配置成功,請注銷當前會話,重新登錄。如果這是您第一次運行 keychain,則您會被要求輸入私鑰的密碼短語。因為 keychain 復用已成功登錄的會話中的 ssh-agent
進程,所以您再次登錄是就無需輸入密碼短語了。當您重啟機器時,您才會被要求再次輸入密碼短語。
另一種啟動 keychain 的方式
調用 keychain 的方法有很多種,您可以自行嘗試,找到最適合您的那一種。keychain
命令提供了不少的選項來進行設置,您可以參考它的手冊。
這里我們介紹其中一種不錯的方法,以 root
身份創建 /etc/profile.d/keychain.sh
,並添加下列內容:
/etc/profile.d/keychain.sh
/usr/bin/keychain -Q -q --nogui ~/.ssh/id_ecdsa [[ -f $HOME/.keychain/$HOSTNAME-sh ]] && source $HOME/.keychain/$HOSTNAME-sh
記得給該腳本加上可執行權限:
# chmod +x /etc/profile.d/keychain.sh
如果您想要在第一次使用私鑰時才輸入密碼短語,而非一開機登錄就輸入的話,您可以將下列內容加入 ~/.bashrc
:
alias ssh='eval $(/usr/bin/keychain --eval --agents ssh -Q --quiet ~/.ssh/id_ecdsa) && ssh'
這樣子,當您開機后首次使用密鑰對連接 SSH 服務器時,您才需要提供密碼短語。但是,這只在 ~/.bashrc
可用的情況下才奏效,所以您應該保證第一次使用 SSH 連接時是在終端下進行的。
envoy
Envoy 算是 keychain 的一個替代品,您可以從 官方軟件倉庫 下載安裝 envoy,或者從 AUR 安裝 envoy-gitAUR。
安裝完成之后,使用以下命令啟用 envoy 套接字 (socket):
# systemctl enable envoy@ssh-agent.socket
加入您的外殼 rc 文件:
envoy -t ssh-agent -a ssh_key source <(envoy -p)
如果您的私鑰為 ~/.ssh/id_rsa
, ~/.ssh/id_dsa
, ~/.ssh/id_ecdsa
,或者 ~/.ssh/identity
,則不需要 -a ssh_key
參數。
利用 KDE 電子錢包存儲密碼短語並和 envoy 配合工作
如果您的密碼短語很長很復雜,那記憶起來是有點痛苦。您可以讓 KDE 電子錢包來為您記住密碼短語哦!
安裝位於 官方軟件倉庫 的 ksshaskpass 和 kdeutils-kwalletmanager[broken link: replaced by kwalletmanager],然后按照上文介紹的方法啟用 envoy 套接字。
添加一個腳本到 ~/.kde4/Autostart/
,輸入以下內容:
~/.kde4/Autostart/ssh-agent.sh
#!/bin/sh envoy -t ssh-agent -a ssh_key
記得加上可執行權限:
$ chmod +x ~/.kde4/Autostart/ssh-agent.sh
添加一個腳本到 ~/.kde4/env/
,加入以下內容:
~/.kde4/env/ssh-agent.sh
#!/bin/sh eval $(envoy -p)
同樣不要忘記加上可執行權限:
$ chmod +x ~/.kde4/env/ssh-agent.sh
當您登錄到 KDE 桌面環境時,它就會自動運行腳本 ssh-agent.sh
。這樣子就能夠調用 ksshaskpass
,當 {{ic|envoy} 調用 {{ic|ssh-agent} 時,{{ic|ksshaskpass} 就會請求您輸入 KDE 電子錢包的密碼了。而 KDE 電子錢包則會保存您的密碼短語,在 ssh-agent
需要的時候由 KDE 電子錢包提供。
pam_ssh
pam_ssh 項目為 SSH 私鑰提供了一個 插入式驗證模塊 (PAM)。當您的密碼短語與系統登錄用戶密碼相同的時候,可以為您減去再次輸入密碼的麻煩。開機登錄時,您需要輸入您的登錄密碼,如有需要,還要輸入 ssh 密鑰的密碼短語。您成功登錄系統之后,ssh-agent
則會在整個會話期間緩存您已解密的私鑰。
要在 tty 模式下使用 pam_ssh,您需要安裝位於 AUR 的 pam_sshAUR 。
~/.ssh/login-keys.d/
下。
您可以為您的私鑰文件創建一個軟鏈接,並放到 ~/.ssh/login-keys.d/
:
$ mkdir ~/.ssh/login-keys.d/ $ cd ~/.ssh/login-keys.d/ $ ln -s ../id_rsa
注意將上述例子中的 id_rsa
換成您對應的私鑰文件。
編輯 /etc/pam.d/login
,將下面例子中高亮加粗的那幾行加進去。請注意配置內容的順序會影響到登錄行為,應當按照例子中的來。
/etc/pam.d/login
#%PAM-1.0 auth required pam_securetty.so auth requisite pam_nologin.so auth include system-local-login auth optional pam_ssh.so try_first_pass account include system-local-login session include system-local-login session optional pam_ssh.so
在上面的例子中,登錄認證初始化進程如平常那樣啟動,用戶要輸入登錄密碼。try_first_pass
選項傳遞給 pam_ssh
模塊,它會嘗試使用用戶密碼作為密碼短語去解密 ~/.ssh/login-keys.d/
下的私鑰。如果用戶密碼與密碼短語一致,那么私鑰可以被解密,用戶就無需再次輸入相同的密碼。如果兩者不同,ssh_pam 模塊會在用戶正確輸入登錄密碼之后輸入密碼短語。optional
可以保證 ~/.ssh/login-keys.d/
下沒有私鑰時,用戶也能夠正常登錄系統。這種情況下,ssh_pam 模塊對於沒有私鑰的用戶來說就等於無。
如果您使用其他方式登錄,比如使用登錄管理器 SLiM (簡體中文) 或者 XDM (簡體中文),您必須按照類似的方法來編輯 PAM 配置文件,才能正常工作。/etc/pam.d/
目錄下保存有默認的配置文件,您可以參考默認配置文件來進行配置。
pam_ssh 已知問題
pam_ssh 並不廣泛使用,其提供的文檔也比較少。您應該注意一下該軟件包的一些使用限制,比如:
- pam_ssh < 2.0 不支持 ECDSA,您必須使用 RSA 或者 DSA。
- pam_ssh 調用的
ssh-agent
進程僅限於當前會話,不能在多個會話中共享。上文提到的 keychain 前端可以避免這個問題。
GNOME Keyring
如果您使用 Gnome,您也可以使用 Gnome 鑰匙圈 (GNOME Keyring) 作為 SSH agent。詳情請參考 GNOME Keyring。
疑難排解
如果您的 SSH 服務器忽略了您的 SSH 密鑰對,您需要檢查一下相關文件的權限是否正確。
本地機器上:
$ chmod 700 ~/ $ chmod 700 ~/.ssh $ chmod 600 ~/.ssh/id_ecdsa
服務器上:
$ chmod 700 ~/ $ chmod 700 ~/.ssh $ chmod 600 ~/.ssh/authorized_keys
如果這樣還不能解決您的問題,您可以試試將 sshd_config
中的 StrictModes
設為 no
。如果將 StrictModes
關閉就能夠順利認證的話,說明相關文件的權限還沒有改對。
StrictModes
設為
yes
。
請確認您的 SSH 服務器支持您所使用的密鑰類型, 可以實施 RSA 或者 DSA。某些服務器可能不支持 ECDSA 密鑰。
如果還不行,打開 sshd 的 debug 模式,查看連接時的日志輸出,查找原因吧:
# /usr/bin/sshd -d
使用 kdm
KDM 並不能直接啟動 ssh-agent
,KDM 要用 kde-agent[broken link: package not found] 來啟動 ssh-agent
,但是 kde-agent
自 20140102-1 開始已經被 移除。
為了讓 KDE 啟動時啟動 ssh-agent
,您可以創建一個腳本用於登錄時啟動 ssh-agent
,還有一個腳本用於注銷時殺死進程:
echo -e '#!/bin/sh\n[ -n "$SSH_AGENT_PID" ] || eval "$(ssh-agent -s)"' > ~/.kde4/env/ssh-agent-startup.sh echo -e '#!/bin/sh\n[ -z "$SSH_AGENT_PID" ] || eval "$(ssh-agent -k)"' > ~/.kde4/shutdown/ssh-agent-shutdown.sh chmod 755 ~/.kde4/env/ssh-agent-startup.sh ~/.kde4/shutdown/ssh-agent-shutdown.sh