
/root/test.sh
リモートサーバーには次のものがあります。
#!/bin/bash
date
リモートサーバーから次の出力を取得します。
# ./test.sh
Fri Dec 18 07:41:10 EST 2015
# bash <(cat /root/test.sh)
Fri Dec 18 07:41:23 EST 2015
ただし、ローカルコンピュータで同じコマンドを実行しようとすると、次の結果が表示されます。
$ ssh root@remote_server /root/test.sh
Fri Dec 18 07:44:32 EST 2015
$ ssh root@remote_server bash <(cat /root/test.sh)
cat: /root/test.sh: No such file or directory
bash: /dev/fd/63: No such file or directory
それでは、前回実行したときの問題は何でしたか?このようなスクリプトを実行するのは奇妙だと思うかもしれませんbash <(cat /root/test.sh)
。私がこれを行う理由は、それが私の現実の単純化されたバージョンだからです。私の実際のコードは、インターネットからダウンロードしてローカルで実行するBashスクリプトです。さまざまなパラメータを使用して実行するコンピュータが多いため、ローカルコンピュータで実行しようとしています。
答え1
このようにファイル記述子を渡すことはできませんssh
。<(...)
この構成はシステムにダミーファイルを生成し、リモートシステムで実行しても意味がありません。
実際に使用したい場合は引用符で囲み、bashがある場合はリモートシステムで評価されます。
ssh root@remote_host "bash <( cat /root/test.sh )"
答え2
私の提案は、リモートホストでスクリプトを実行し(/root/test.sh
)、実行可能にし(chmod u+x /root/test.sh
)、次のように実行することです。
ssh root@remote_server /bin/bash -c /root/test.sh
/bin/bash: /dev/fd/63: No such file or directory
この答えを読むことができる理由について
[1]。
注:不要なセキュリティリスクを避けるために、コマンド名()の代わりにフルパス
()を使用することをお勧めします。/bin/bash
bash
2]。
別の方法は
ssh root@remote_server << EOF
cat /root/test.sh
# whatever else
EOF
2番目のEOFまですべての行を実行します...これを変換できます...
答え3
最近同じ問題が発生しましたが、これが実行されたときにのみ発生することに気づきました。sudo/ルートユーザー。
私が実行した場合:
sudo bash <(echo "It worked")
私は得る:
bash: /dev/fd/63: No such file or directory
しかし、私が実行した場合:
bash <(echo "It worked")
それは非常にうまく動作します。