[英]How do I properly use SSH heredoc?
這個問題與我在這里提出的問題有些相關,但尚未得到充分回答。 我在這里感興趣的是以下內容:
當我在遠程計算機上運行命令type -t test
時,我得到了答案“函數”,因為“測試”是遠程計算機上 .bashrc 文件中的現有 function。
但是,當我在本地計算機上運行此 SSH 命令時,
s="$(
ssh -T $HOST <<'EOSSH'
VAR=$(type -f test)
echo $VAR
EOSSH
)"
echo $s
我沒有打印任何東西。 第一個問題是如何使這項工作?
第二個問題建立在前一個問題的基礎上。 也就是說,我的最終目標是在本地計算機上定義我想在遠程計算機上檢查的 function 並提出適當的答案,即:
a="test"
s="$(
ssh -T $HOST <<'EOSSH'
VAR=$(type -f $a)
echo $VAR
EOSSH
)"
echo $s
所以,我希望變量 s 等於“函數”。 怎么做?
我該怎么做?
加載.bashrc
( . .bashrc
) 或啟動交互式 session ( bash -i
)。
因為你的工作不是交互式的,如果你想加載.bashrc
並且它對非交互式使用沒有保護,只需加載它。 如果沒有,也許將您的 function 移到其他地方,以便您可以采購。 如果沒有,請准備好交互式 session 可能會打印 /etc/motd 和 /etc/issue 以及其他交互式內容。
刪除-T
- 非交互式工作不需要 tty。
我希望變量 s 等於“函數”。 怎么做?
我建議使用declare
來傳輸您需要的所有工作和上下文,它靈活且通用,保留 STDIN 並且不需要您處理此處文檔中的錯綜復雜的 escaping。 具體從遠程請求bash
shell 並使用printf "%q"
正確轉義所有數據。
functions_to_check=(a b c)
fn_exists() { [[ "$(LC_ALL=C type -t -- "$1" 2>/dev/null)" = function ]]; }
work() {
for f in "${functions_to_check[@]}"; do
if fn_exists "$f"; then
echo "Great - function $f exists!"
else
echo "Och nuu - no function $f!"
fi
done
}
ssh "$host" "$(printf "%q " bash -c "
$(declare -p function_to_check) # transfer variables
$(declare -f fn_exists work) # transfer functions
work # run the work to do
")"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.