- PR -

ssh経由で echo "hello!!!" > test.txt をしたいのですが。。。

投稿者投稿内容
McLaren
ぬし
会議室デビュー日: 2002/01/15
投稿数: 784
お住まい・勤務地: 東京
投稿日時: 2005-06-21 09:46
 いつも大変お世話になっております。
Linuxマシンが2台あります。

WS01
WS02

WS01からWS02へはパスワードレスでssh接続ができるようになっておりまして、WS01側でシェルスクリプトを実行して、WS02のtest.txtにテキストをリダイレクトしたいと思っております。

[user@WS01 user]# ssh user@WS02 echo "hello!!!" > test.txt

ではWS02のtext.txtには書き込まれませんでした。
正しくはどう書けばよろしいでしょうか。
何卒ご教授のほどよろしくお願いいたします。
kaz
ぬし
会議室デビュー日: 2003/11/06
投稿数: 5403
投稿日時: 2005-06-21 10:16
おはようございます.

手順を端折らないで順番にやるほうがよろしいのでは?
まず ssh で ws01 -> ws02 に login した上で
その command を叩くとどうなりますか?
McLaren
ぬし
会議室デビュー日: 2002/01/15
投稿数: 784
お住まい・勤務地: 東京
投稿日時: 2005-06-21 10:18
 ご返答ありがとうございます。
sshでログインした上で

echo "hello!!!" > test.txt

をたたくと、成功いたします。
angel
ぬし
会議室デビュー日: 2005/03/17
投稿数: 711
投稿日時: 2005-06-21 11:21
おはようございます。
引用:
WS01側でシェルスクリプトを実行して、WS02のtest.txtにテキストをリダイレクトしたいと思っております。


ssh による通常のリモートコマンド ( ssh user@host command ) から 2ひねり必要ですね。

1. クライアント側に送られてくる出力をサーバ側でリダイレクト
 ssh user@host command > file では、クライアント側でリダイレクト処理がされますから、
 ssh user@host 'command > file' もしくは、ssh user@host command \> file ですね。

2. コマンドの実行はクライアント側
 つまり、リモートでは「入力結果を保存する」ためのコマンドを指定して、クライアント側で実行したコマンドの出力をパイプで渡す形になります。つまり、

 command | ssh user@host command2 ( command2 は入力結果を保存するためのもの )

以上、ご参考まで。
McLaren
ぬし
会議室デビュー日: 2002/01/15
投稿数: 784
お住まい・勤務地: 東京
投稿日時: 2005-06-21 11:48
 angelさま、いつもお世話になっております。
な、なんと。あっさり成功しました。

 ご教授いただきありがとうございます。今後ともよろしくお願いいたします。
McLaren
ぬし
会議室デビュー日: 2002/01/15
投稿数: 784
お住まい・勤務地: 東京
投稿日時: 2005-06-21 13:49
 別スレッドにすべきかもわかりませんが。。

[user@WS01 user]$ ssh user@WS02 'echo "hello!!!" > test.txt'

で成功しましたので早速shellスクリプトにしてみましたら

#!/bin/sh
STRMSG="hello!!!"
ssh user@WS02 'echo $STRMSG > test.txt'

とやるとtest.txtには空文字列しか入りませんでした。
もちろん

#!/bin/sh
ssh user@WS02 'echo "hello!!!" > test.txt'

とやると成功したのですが、わけあってどうしても変数でやりたいと思っております。
どのように書けばよろしいでしょうか。

何卒ご教授よろしくお願いいたします。
Mattun
ぬし
会議室デビュー日: 2004/08/10
投稿数: 1391
投稿日時: 2005-06-21 14:08
引用:

#!/bin/sh
STRMSG="hello!!!"
ssh user@WS02 'echo $STRMSG > test.txt'

とやるとtest.txtには空文字列しか入りませんでした。


どこがローカルで実行されているコマンドで、
どこがリモートで実行されているコマンドなのか、
見分ける努力しましょう。

また、特に理由が無いなら、/bin/shじゃなくて/bin/bashで動かす
スクリプトにしましょう。
また、#!/bin/bash -x や #!/bin/bash -v あたりに変更して実行すれば、
実際のパラメタ展開の様子も把握できます。
今自分がわかってないだろうことを把握するためのひとつの手段です。


上記だと、3行目部分がシェルに解釈される時点では、
シングルクォート内の変数は展開されないため、
コード:
ssh user@WS02 echo $STRMSG > test.txt


が実際には実行されるコマンドになります。
なので、リモートで実行されるコマンドは
コード:
echo $STRMSG > test.txt


になります。
変数はリモートでやっとこさ展開されます。

コード:
ssh user@WS02 'STRMSG="hello!!!"| echo ${STRMSG} > test.txt'


とか、
コード:
STRMSG="hello!!!"
ssh user@WS02 "echo ${STRMSG} > test.txt"


とか。

変数をリモートで定義してリモートで展開する例と、
変数をローカルで定義してローカルで展開する例を書いてみました。
angel
ぬし
会議室デビュー日: 2005/03/17
投稿数: 711
投稿日時: 2005-06-21 14:33
この手のスクリプトは、変数展開とクォートが、実は予想以上に難しいので注意が必要です。

正しくは、
 ssh user@WS02 "echo '$STRMSG' > test.txt"
もしくは
 ssh user@WS02 echo \\'"$STRMSG"\\' \> test.txt

※その他、
 ssh user@WS02 "echo \"$STRMSG\" > test.txt"  とか
 ssh user@WS02 echo "$STRMSG" \> test.txt とか
 ssh user@WS02 echo \\'$STRMSG\\' \> test.txt とか、紛らわしい例も…

ちなみに、
 STRMSG="hello!!!" は、本当に正しく動作しますか?
 STRMSG='hello!!!' でないとマズくないでしょうか。

[ メッセージ編集済み 編集者: angel 編集日時 2005-06-21 14:38 ]

スキルアップ/キャリアアップ(JOB@IT)