簡體   English   中英

如何正確使用 SSH heredoc?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM