在一行中使用此處文檔?

在一行中使用此處文檔?

我有一個簡單的腳本,它使用ssh此處文件在遠端主機上執行命令。

我試圖在命令列中使用一行程式碼來完成此操作,但我不知道如何在腳本之外執行此處文件。是否可以?我花了一些時間在谷歌上搜尋並閱讀有關此處文檔的文檔,但我並沒有想到。

這個腳本工作正常 - 我需要此處文檔部分才能awk透過 ssh 遠端運行,但我通常喜歡為簡單的事情做一些簡單的事情:

#!/bin/bash
# it looks up all my hosts with 'db' in the name
# then gets the PID of any rsyncs running as user 'research'
# and pumps them into xargs

getHosts=(`curl --silent "http://assetts.lab/all_hosts" | grep -v ^# | awk -F" " '{print$1}'|grep db`)
for BOX in ${getHosts[@]};do
    echo "$BOX: "
    ssh -T sshUser@$BOX <<"EOF"
ps -ef | egrep "rsync|iasync" | awk -F" " '{if ($1 ~ "research") print $2}'|sudo xargs -i ps -fp '{}'
#ps -ef | egrep "rsync|iasync" | awk -F" " '{if ($1 ~ "research") print $2}'|sudo xargs -i kill '{}'
EOF
    echo
done

我可能錯過了一些簡單的東西......無論如何,感謝您的任何建議:)

答案1

我真的不認為需要對此處文件的使用做任何事情,但我看到您可以大大簡化腳本中的其他內容(這反過來又使此處文件過時)。

首先,填充getHosts數組的管道可能會被簡化(很少有理由通過管道grep進入awk),並且可以刪除整個數組:

curl -s 'http://assetts.lab/all_hosts' |
awk -F ' ' '!/^#/ && $1 ~ /db/ { print $1 }' |
while IFS= read -r remote; do
   # rest of code
done

在這裡,我將您的 ++ 命令合併grep為一個命令。我還讓命令將主機名稱直接輸入循環中,而不是將它們儲存在中間變數中。awkgrepawkawk

在循環內部,看起來好像您想要獲取有關屬於使用者的rsync或進程的資訊。iasyncresearch

最好這樣做pgrep

pgrep -l -U research 'rsync|iasync'

若要向這些進程發出訊號,請使用pkillin 代替pgrep並刪除該-l選項。

完整的腳本變成:

#!/bin/sh

curl -s 'http://assetts.lab/all_hosts' |
awk -F ' ' '!/^#/ && $1 ~ /db/ { print $1 }' |
while IFS= read -r remote; do
   printf 'Processing host "%s"\n' "$remote"
   ssh "$remote" 'pgrep -l -U research "rsync|iasync"'
done

或者,使用xargs

#!/bin/sh

curl -s 'http://assetts.lab/all_hosts' |
awk -F ' ' '!/^#/ && $1 ~ /db/ { print $1 }' |
xargs -I {} sh -c '
   printf "Processing host \"%s\"\n" "$1"
   ssh "$1" "pgrep -l -U research \"rsync|iasync\""' sh {}

如果您xargs支持,可以使用sh -c來同時運行多個進程-P n,其中是應保持運行的並發命令n的數量。sh -cxargs

答案2

EOF bash 功能基本上與您在範例中所做的一樣使用,即將多行文字發送到另一個命令。

如果您希望將其作為一句台詞,則必須刪除 EOF。

為了使用 ssh 在遠端主機上執行命令,您需要做的就是:

ssh host command

例如:

ssh host "ls -alh"

將在主機上運行命令並在控制台上返回輸出。

如果您注意如何使用引號,則可以將範例程式碼重寫為一行,如下所示:

ssh host "ps -ef | egrep 'rsync|iasync' | awk -F' ' '{if (\$1 ~ \"research\") print \$2}'"

這個雙引號字串將各個指令的參數放在單引號中。當需要更多雙引號("research“模式”)時,必須使用 a 對其進行轉義\,字元也是如此$

相關內容