dポイントプレゼントキャンペーン実施中!

1回のsshコマンドでサーバーファイル内容の一部をローカルファイルの内容で置換する方法はありますか。
sshコマンドを2回使用すればできるのですが、2回連続で同パスワードを入力するスクリプトは格好悪いので、何とか1回のsshコマンドでこれを実現したいと思っています。
私が考えたコマンドは次の2行です。
ssh サーバー名 'cat >一時ファイル名' <ローカルファイル名
ssh サーバー名 'sed -e "s/置換文字列/`cat 一時ファイル名`/" サーバーファイル名 >一時ファイル名; cat 一時ファイル名 >サーバーファイル名; rm 一時ファイル名'
1行目のコマンドは、置換に使用するローカルファイルをサーバーへ複製しています。
2行目のコマンドは、複製したファイルを使用してサーバーファイルの内容を置換しています。置換後、用済みになった複製ファイルを削除しています。
;を使用すれば2行目のコマンドのように1行のsshコマンド中に複数のコマンドを記述できるのですが、
1行目のコマンドと2行目のコマンドを合体させるとうまくいかないのです。
いろいろ工夫したのですが、今の私の力ではこれ以上単純化することができませんでした。
もっと単純化すれば1行に合体できる気がするのです。
どなたか、良い案がありましたら教えてください。

A 回答 (4件)

2回目の ssh の sed 中, `cat 一時ファイル名` ってやってますが, これは結局のところ 1回目の ssh で作ったファイルの中身ですよね? だったら,


ssh サーバー名 'sed -e "s/置換文字列/`cat`/" サーバーファイル名 > 一時ファイル名; cat 一時ファイル名 > サーバーファイル名; rm 一時ファイル名' < ローカルファイル名
でよさそうな気がするんだけど....
    • good
    • 0
この回答へのお礼

Tacosanさん、ご返信ありがとうございます。
出来ました!!
私が1行のコマンドを作成したときは<ローカルファイル名をsedの直後に記述していましたので、うまくいかなかったのですね。
Tacosanさんのようにサーバー側の操作を''で括って最後尾に`cat`の入力元である<ローカルファイル名を記述すればよかったのですね。
この記述方だと`cat`と<ローカルファイル名がすごい離れているため、私ひとりで考えていてはとうてい気が付かなかったでしょう。
リダイレクションは、このような巧妙な書き方ができるのですね。
さて、実はここで新しい問題が発生してしまったのです。
SSHサーバーはルートログインを禁止しているため、ユーザー名@サーバー名のようにユーザーを指定してsshを実行しています。
ところが、今回置換したいサーバーのファイルはルート以外の書き込みを禁止しているため、sshコマンド中でsu -を実行しようとしました。
そうしたらstandard in must be a ttyというエラーメッセージが表示されてsu -が失敗してしまいました。
どうも、sshコマンド中でsuを実行するとこのような現象が起こるようです。
次のように単純なコマンドでも失敗してしまいました。
$ ssh ユーザー名@サーバー名 su -
ユーザー名@サーバー名's password:
standard in must be a tty
$
スミマセンが、こちらの問題に関しても何か助言がありましたら、教えてください。

お礼日時:2006/08/16 17:38

この件で実用的か分かりませんが、


サーバ側で何かルート権限で実行させてい、かつ、サーバ側に何かプログラムがインストール可能ならsudoコマンドをインストールしてsuコマンドの変わりに使用するのはどうでしょうか?

※参考
【連載】止められないUNIXサーバのセキュリティ対策
第5回 サービスをセキュアにするための利用制限(3)
~管理者権限の制限のためのsuとsudoの基本~
http://www.atmarkit.co.jp/fsecurity/rensai/unix_ …
    • good
    • 0
この回答へのお礼

Leanさん、ご返信ありがとうございます。
sudoの基本について読みました。
sudoは、けっこう標準的なコマンドらしく、最小構成でインストールした私のレッドハットにも入っていました。
このsudoを使用すればsuでは実現できなかった、sshコマンド中での管理者権限コマンドが可能になりますね。
ただし、前準備としてサーバーのsudoersの編集とwheelグループへの登録が必要になるのですね。
この前準備をやっていて、ふと思いました。
SSHサーバーのルートログインを禁止する設定についてです。
ルートログインを禁止することはセキュリティー上重要です。
しかし、禁止しているのはルートログインのみで、一般ユーザーでログインしてsuを実行するのは普段から普通に利用しているのです。
ですので、ルートログインを禁止しようが、許可しようが、suを使用する以上、結局ネットワーク上に管理者のパスワードが流れるのですよね。
これはtelnetでもrshでも同様だと思います。
以上の考察より、SSHサーバーをルートログインを許可する設定に変更しました。
これによりsshコマンド中でsuやsudoを使用するといった巧妙な手口を使用せずとも、私がやろうとしていたことが可能になります。
コマンド行が長くて見づらいですが、これでできました。
ssh サーバー名 'sed "s/置換文字列/`cat`/" サーバーファイル名 >/一時ファイル名; mv 一時ファイル名 サーバーファイル名' <ローカルファイル名
sshコマンド中でsedとmvの2コマンドを実行しています。
置換した結果を直接サーバーファイルにリダイレクトするとサーバーファイルが消えてしまうので、いったん一時ファイルに書き込みます。
そのあとmvを使用して目的のファイルに書き込めば、一時ファイルを消す手間もなくなり、クリーンですね。
そしてcatにローカルファイルを読み込ませるのは、''の外から<ローカルファイル名でできました。

お礼日時:2006/08/23 21:20

>$ ssh ユーザー名@サーバー名 su -


>ユーザー名@サーバー名's password:
>standard in must be a tty

標準入力はtty(端末)でなければならない。
sshでサーバにログインしsu -を実行した時、suはパスワードの入力を端末(tty)から求めているが、サーバー側でのsuのプロセスにはパスワードを入力するはずの端末が割り当たっていないのでエラーになっている。

端末が割り当たっているとは、例えば下記のようにpsコマンドを実行した際、TTYの項目に(下記の場合だと)pts/1なとと表示される事です。

$ ps
PID TTY TIME CMD
23126 pts/1 00:00:01 bash25870 pts/1 00:00:00 ps

実際にsshでコマンドを実行した場合どうだかというと、

$ ssh lean@linux-server sleep 100

と実行した時、linux-server側でpsコマンドで該当するプロセスを見ると

$ ps -ef
UID PID PPID C STIME TTY TIME CMD
lean 25875 25874 0 21:50 ? 00:00:00 sleep 100

というようにTTYの項目は?となっていて端末が割り当たっていない状態だというのが分かると思います。
    • good
    • 0
この回答へのお礼

Leanさん、ご返信ありがとうございます。
確認しました!
確かに?になっていました!
suコマンドは端末からパスワードを入力しないといけないのですね。
そしてsshコマンド中で生成したプロセスには端末が割り当てられないのですね。
以上より・・・sshコマンド中でsuを実行することは不可能という回答が導き出されたわけですが・・・・。
うーむ、だとしたらどのような代替案をとるべきか・・・。

今、思い浮かんだのは、あらかじめサーバー側に置換のためのスクリプトを用意しておき、ローカルのスクリプトからは単にsshコマンド中でその置換スクリプトを実行するだけにするとか・・・
うーん、あまり格好良くないな~。

ところでLeanさん、つい先日も別の質問にご回答いただきましたね!
聞いてばかりで面目ないです。。。

お礼日時:2006/08/16 22:37

普通にscpでリモートファイルを上書きするのではダメなのでしょうか?


パスワード無しの公開鍵認証方式にすれば、パスワード入力も省略できます。
    • good
    • 0
この回答へのお礼

astronautさん、ご返信ありがとうございます。
リモートファイルを上書きするのはダメなのです~。
何とかしてリモートファイルの一部をローカルファイルの内容に置換したいのです。
また、パスワード入力を省略するのは避けて、何とか1回のパスワード入力で実現したいのです。
何か良い方法はありませんでしょうか。
もしくは、同スクリプト中で、自動的にパスワード無しの設定をして、当該処理の後にパスワード有りの設定に戻すようなことはできるのでしょうか。
もしご存知でしたら、ぜひ教えていただけないでしょうか。
でも、パスワード無しの設定をするためには公開鍵を、あらかじめサーバーへ転送しておく必要があるのですよね・・・。
そう考えると、どうも同一スクリプト中でこの操作を全部行うのは、難しそうですね。。。

お礼日時:2006/08/16 12:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!