23

`sub-code` または $(sub-code) を含む単一のコマンドを実行しようとしてsshいます (常に使用していますが、その正式な名前はわかりません) が最初に実行されますが、ターゲット サーバー。

議論のために、これが私が使いたいコマンドだとしましょう。もちろん、これは で実行できますhostnameが、これは、使用したいすべての書式設定ウィザードを含む単純化された例にすぎません。

echo `uname -a | awk '{print $2}'`

問題ない。sshしかし、これを適切にエスケープして 1 つのコマンドで送信するにはどうすればよいでしょうか。以下は、サーバーがローカル ホスト名を応答できるようにするため、間違っています。サブコードはローカルで実行されます。

ssh myServer echo `uname -a | awk '{print $2}'`

しかし、頭に浮かぶエスケープっぽいものは機能しません。

$ ssh myServer echo \`uname -a | awk '{print $2}'\`
awk: cmd. line:1: {print $2}`
awk: cmd. line:1:           ^ invalid char '`' in expression
$ ssh myServer echo \$(uname -a | awk '{print $2}')
bash: syntax error near unexpected token `('
$ ssh myServer echo \$\(uname -a | awk '{print $2}')
bash: syntax error near unexpected token `)'
$ ssh myServer echo \$\(uname -a | awk '{print $2}'\)
awk: cmd. line:1: {print $2})
awk: cmd. line:1:           ^ syntax error
bash: -c: line 0: unexpected EOF while looking for matching `)'
bash: -c: line 1: syntax error: unexpected end of file

` or $() because I'd like to know if it's possible.適切にエスケープされたecho`の使用を含む回答は、もっと複雑になる可能性があります。

4

6 に答える 6

65

これを試して

ssh myServer "uname -a | awk '{print \$2}' "

"リモートで実行するコマンドをグループ化するには、二重引用符を使用します。

ローカルで計算されず、リモートに渡されるよう$に、引数でをエスケープする必要もあります。$2awk

編集:

を含めたい場合は、次のように記号$( )をエスケープする必要があります。$

ssh myServer "echo \$(uname -a | awk '{print \$2}') "

次のように、バッククォート` をエスケープすることもできます。

ssh myServer "echo \`uname -a | awk '{print \$2}'\` "
于 2013-02-05T13:05:50.283 に答える
7

より複雑なコマンドでどこでも引用符をエスケープすることを避けるために、ヒアドキュメントを使用することをお勧めします。ssh

ssh -T myServer <<-'EOF'
uname -a | awk '{print $2}'
exit
EOF
于 2018-06-14T08:33:12.990 に答える
5

コマンドの出力をパイプして awk をローカルで実行するのはどうですか?

ssh yourhost uname -a | awk '{ print $2 } '
于 2013-02-05T12:28:18.680 に答える
4

回避策は、コマンドを使用して sh ファイルを作成し、それを ssh コマンドに渡すことです。

test.sh

echo `uname -a | awk '{print $2}'`

そしてコマンド:

ssh myServer 'bash -s' < test.sh

更新

引用符なしのコマンドも正常に機能します。

ssh myServer uname -a | awk '{print $2}'
于 2013-02-05T12:33:00.070 に答える
3

追加のメモ:

私の場合、エスケープは$役に立ちません:

ts1350:> ssh sysadm@node "grep feature features.txt| awk '{print $6}' "
Password: 
A  feature   -name  ue_trace_mme    | off
ts1350:> ssh sysadm@node "grep feature features.txt| awk '{print \$6}' "
Password: 
awk: cmd. line:1: {print \}
awk: cmd. line:1:        ^ backslash not last character on line
awk: cmd. line:1: {print \}
awk: cmd. line:1:        ^ syntax error
ts1350:> ssh sysadm@node "grep feature features.txt| awk '{print \\$6}' "
Password: 
awk: cmd. line:1: {print \\}
awk: cmd. line:1:        ^ backslash not last character on line
awk: cmd. line:1: {print \\}
awk: cmd. line:1:        ^ syntax error

spaceの間に追加する$と、番号が機能します。

Fri Oct  4 14:49:28 CEST 2019
ts1350:> ssh sysadm@node "grep feature features.txt| awk '{print $ 6}' "
Password: 
off

この二次的な方法が私のような人を助けることを願っています.

@dave の回答に感謝します: How to print a specific column with awk on a remote ssh session?

于 2019-10-04T13:10:24.907 に答える
2

ホスト名を取得しようとしている場合は、次を使用します。

ssh myServer "uname -n"

于 2013-05-14T20:27:59.033 に答える