我正在嘗試在一個命令中運行以下兩個命令。
eval "$(ssh-agent)"
ssh add ~/.ssh/id_rsa
我嘗試了許多可能的解決方案:
su username -c "{ eval $(ssh-agent -s) }; ssh-add ~/.ssh/id_rsa"
su username -c "eval $(ssh-agent -s)" ; ssh-add ~/.ssh/id_rsa
su username -c "eval $(ssh-agent -s)" && ssh-add ~/.ssh/id_rsa
su username -c "eval $(ssh-agent -s)" && "ssh-add ~/.ssh/id_rsa"
似乎第一個命令運行成功,但第二個命令要么回應 Permission denied 訊息(意味著它與當前用戶一起運行),要么無法連接到身份驗證代理(意味著它可能為第二個命令創建了一個新會話)。
錯誤資訊:
Could not open a connection to your authentication agent.
Error connecting to agent: Permission denied
如果我按順序單獨運行它們,它可以作業:///
目的是使用這些帶有變數的命令創建一個 bash 腳本,如下所示:
folder=/home/q12
username=q12
su $username -c "{ eval $(ssh-agent -s) }; ssh-add $folder/.ssh/id_rsa"
由于變數的原因,我不能參考整個命令,因為它對“;”很敏感 和 ”&&”。
誰能幫我這個?謝謝!
uj5u.com熱心網友回復:
你需要單引號。否則,將在當前背景關系中評估命令替換。
su username -c 'eval "$(ssh-agent -s)"; ssh-add ~/.ssh/id_rsa'
編輯:
要獲得條件執行ssh-add,您可以執行以下操作:
su username -c 'script=$(ssh-agent -s) || exit 1; eval "$script"; ssh-add ~/.ssh/id_rsa'
# or
su username -c 'set -e; script=$(ssh-agent -s); eval "$script"; ssh-add ~/.ssh/id_rsa'
in 的引數su -c STRING是一個命令字串,類似于bash -c STRING. 我們還可以在單??引號內嵌套雙引號。
uj5u.com熱心網友回復:
您的第一次嘗試是最接近的,但是在雙引號內,例如在將它們作為引數傳遞給之前$(ssh-agent -s)由您的 shell 進行評估。最終結果:ssh 代理在當前用戶下運行,所以其他用戶無法使用。su
您需要將評估延遲到其他用戶 shell。使用單引號而不是雙引號可以做到這一點,但是在您擁有的實際命令中,您顯然希望由您的$folder外殼評估(它不會在其他用戶外殼中定義),所以您不想延遲對此的評價。最簡單的方法是轉義您想要延遲評估的 (您的 shell 將洗掉轉義,因此其他用戶的 shell 將看到并評估它):$
su "$username" -c "{ eval \$(ssh-agent -s) }; ssh-add $folder/.ssh/id_rsa"
# ^ Note the escape
(順便說一句,我還在用戶名周圍添加了雙引號,因為這通常是良好的腳本衛生。引號$folder更復雜,只要不包含任何奇怪的字符就不需要,所以我跳過了它。)
另一種選擇是單引號部分命令并雙引號另一部分(混合參考看起來很奇怪,但在 shell 語法中是完全合法的):
su "$username" -c '{ eval $(ssh-agent -s) };'" ssh-add $folder/.ssh/id_rsa"
# ^ single-quoted part ^^ double-quoted part ^
其余嘗試無效的原因是命令(;或)之間的分隔符不在帶引號的字串中,因此被您的&&shell視為分隔符,因此第二個命令在您的用戶 ID 下運行而不是作為命令的一部分。su
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/527930.html
