私は本質的にマシンAからSSHを介してマシンBにコマンドを実行し、出力をマシンAに返すスクリプトを実行したいと思います。
したがって、可能であればこれを行うためのcshスクリプトを作成したいと思います。
たとえば、このソリューションは次のとおりです。この回答コマンドラインでの作業:
ssh user@host << 'ENDSSH'
ls -l
ENDSSH
ローカルではなくリモートでlsが実行されていることを確認できます。
しかし、ローカルで実行されるcshスクリプト内のバックティック内でこれを実行したいと思います。可能ですか?
私はSSHを介してログインし、リモートスクリプトを実行できることを知っていますが、私の場合はそうではありません。
また、SSHを介してローカルに保存された2番目のスクリプトを送信できると聞きました(私も見つけませんでした)。しかし、すべてのコマンドを元のスクリプトに含めてHEREDOCを含めるというアイデアが好きです。
これは非常に具体的な問題であることを知っていますが、方法がある場合はどうすればよいかを知ると本当に良いようです。
うまくいかないもの
1)
`ssh user@host<<'ENDSSH'`
`echo "ls -l"`
`echo "ENDSSH"`
エラーが発生します。
stty: standard input: Invalid argument.
stty: standard input: Invalid argument.
Warning: Command not found
その後、ls -l
ローカルで実行され、ローカルで実行しようとしますが、ENDSSH
もちろん失敗し、コマンドが見つかりません。
2)
`ssh user@host<<'ENDSSH'`
echo "ls -l"
echo "ENDSSH"
ls -l
とテキストとしてのみ表示されることを除いて、上記と同じ問題ですENDSSH
。言葉になりますね…HEREDOCが部分的に失敗したからです。
三)3-5は私が要求するものではありませんが、まだ基本的なケースが機能するように努めています。
`ssh user@host ls-l`
はいtotal: Command not found.
、どこから来たのかわかりません。
4)
`cat ./test.csh | ssh user@host`
また、試行#1と同じ結果を返します。
5)
`cat ./test.csh | ssh -t user@host`
#1と4と同じです。
他のソリューションのためにstackoverflow / Ubuntu / serverfault ... etcを使い始めました。ほとんどの人は、ローカルで実行されているスクリプトからリモートでコマンドを実行するのではなく、コマンドラインからリモートでスクリプトを実行する方法を尋ねます。
編集する
まあ、私は問題の一部を解決したと思います。上記のケース3を例にとると、ls -l
ローカルで実行され、次の出力の最初の部分がSSHを介してコマンドに送信されます。
に設定しようとしたので、これを知りましたssh user@host $CMD
。その後、出力がls出力から出ていることに気づきました。しかし、まだこの問題をどのように解決するかは確信していません。$CMD
"whoami"
username: Command not found
total
答え1
実行したいコマンド全体をバックティック内でラップすると、正しい解決策が得られる可能性が高くなります。変数やその他の補間された要素の評価に関していくつかの問題がありますが、今はこれらの問題を取り除きます。
しかし、バックティックになっているアイテムが欲しいのはなぜかわかりません。あなたの質問にリモートでローカルスクリプトを実行したいと思います。最初の例はまさにそのことです。
ssh -q user@host << ENDSSH
hostname
ls -l
id
ENDSSH
リモート実行の出力を変数に入れたいですか?質問どこにもそのような言葉はありませんが、あなたはそうします(bash
)
result=$(ssh user@host <<'ENDSSH'
hostname
id
ENDSSH
)
...
echo "$result"
それとも、おっしゃったからcsh
こうです。
set result = `ssh -q user@host` <<ENDSSH
hostname
id
ENDSSH
...
echo "$result"
バリアントの場合、csh
すべての出力ラインが一緒に接続されます。
バグを報告したことが確認されます。リモートサーバーのログインスクリプトにコマンドがあるstty: standard input: Invalid argument.
ためです。stty
これは対話型シェルテストに含める必要があります。あなたは次のことをしますbash
:
if test -n "$PS1"
then
# Interactive setup here
stty ...
fi
答え2
何をしたいのか分かりませんが、これは私にとって効果的でした。
R=`ssh -t hostname <<EOF
ls -l
EOF`
stdioがリダイレクトされても、EOFが終了するまでバックティックをオフにせずに-tオプションを使用して仮想TTYを作成します。