ssh
ここでは、ドキュメントを使用してリモートホストでコマンドを実行する簡単なスクリプトがあります。
コマンドラインから1行のコードでこれを実行しようとしていますが、ここで説明されているようにスクリプトの外部で実行する方法がわかりません。可能ですか?ここで文書をインターネットで検索して読むのに時間を費やしましたが、そのようなことは起こりませんでした。
このスクリプトはうまく動作します。 SSHを介してリモートで実行するにはここにドキュメント部分が必要awk
ですが、通常は簡単な作業のために簡単な作業を実行するのが好きです。
#!/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
1つのコマンドにまとめました。また、ホスト名を中間変数に保存せずにループに直接入力するコマンドを使用しました。awk
grep
awk
awk
rsync
ループ内では、ユーザーに属するプロセスに関する情報を取得したいようです。iasync
research
次のことをお勧めしますpgrep
。
pgrep -l -U research 'rsync|iasync'
これらのプロセスにシグナルを送信するには、代わりにpkill
inを使用して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 -c
xargs
答え2
EOF bash機能は、基本的に例で使用したように使用されます。つまり、複数行のテキストを別のコマンドに送信します。
1行で表示するには、EOFを削除する必要があります。
SSHを使用してリモートホストでコマンドを実行するには、次のようにします。
ssh host command
たとえば、
ssh host "ls -alh"
ホストでコマンドを実行し、コンソールに出力を返します。
引用符の使用方法に注意を払うと、次のようにサンプルコードを1行に書き直すことができます。
ssh host "ps -ef | egrep 'rsync|iasync' | awk -F' ' '{if (\$1 ~ \"research\") print \$2}'"
二重引用符で囲まれたこの文字列は、各コマンドのパラメータを一重引用符で囲みます。もっと二重引用符(「パターン」)が必要な場合は、文字と同様に"research
aを使用してエスケープする必要があります。\
$