bashでsudoおよびsshコマンドをラップする

bashでsudoおよびsshコマンドをラップする

sudoユーザーに切り替えてから、SSHを使用してリモートサーバーでコマンドを実行する必要があります。

実際のコマンド

docker stats --no-stream --format  "\"{{ .Name }}\^C{\"memory\":{\"raw\":\"{{ .MemUsage }}\",\"percent\":\"{{ .MemPerc }}\"},\"Node\":\"{{ \"`hostname -i`\" }}\",\"cpu\":\"{{ .CPUPerc }}\"},"

SSHでも実行できます。

ssh 1.2.3.4 'docker stats --no-stream --format  "\"{{ .Name }}\^C{\"memory\":{\"raw\":\"{{ .MemUsage }}\",\"percent\":\"{{ .MemPerc }}\"},\"Node\":\"{{ \"`hostname -i`\" }}\",\"cpu\":\"{{ .CPUPerc }}\"},"'

しかし、sudo su - core -cに渡そうとすると、「パターン一致」のため動作しません。このコマンドを正しくラップするにはどうすればよいですか?

sudo su - core -c 'ssh 1.2.3.4 'docker stats --no-stream --format  "\"{{ .Name }}\^C{\"memory\":{\"raw\":\"{{ .MemUsage }}\",\"percent\":\"{{ .MemPerc }}\"},\"Node\":\"{{ \"`hostname -i`\" }}\",\"cpu\":\"{{ .CPUPerc }}\"},"''

答え1

1つの解決策は、最初に実行してsudo su - coreユーザーを変更してからコマンドを実行することです。その後、exit元のユーザーに戻るために書くだけです。しかし、あなたは気の利いた言葉が欲しいと思います。この場合、これはうまくいくと思いますが、残念ながらテストすることはできません。

sudo su - core -c ssh\ 1.2.3.4\ 'docker stats --no-stream --format  "\"{{ .Name }}\^C{\"memory\":{\"raw\":\"{{ .MemUsage }}\",\"percent\":\"{{ .MemPerc }}\"},\"Node\":\"{{ \"`hostname -i`\" }}\",\"cpu\":\"{{ .CPUPerc }}\"},"'

答え2

ここではドキュメントで動作します。

 sudo su - core << 'END_SUDO'
    ssh self << 'END_SSH'
    docker stats --no-stream --format  '"{{ .Name }}{"memory":{"raw":"{{ .MemUsage }}","percent":"{{ .MemPerc }}"},"Node":"{{ "'"$(hostname -i)"'" }}","cpu":"{{ .CPUPerc }}"},'
    END_SSH
    END_SUDO

関連情報