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行に合体できる気がするのです。
どなたか、良い案がありましたら教えてください。
No.2ベストアンサー
- 回答日時:
2回目の ssh の sed 中, `cat 一時ファイル名` ってやってますが, これは結局のところ 1回目の ssh で作ったファイルの中身ですよね? だったら,
ssh サーバー名 'sed -e "s/置換文字列/`cat`/" サーバーファイル名 > 一時ファイル名; cat 一時ファイル名 > サーバーファイル名; rm 一時ファイル名' < ローカルファイル名
でよさそうな気がするんだけど....
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
$
スミマセンが、こちらの問題に関しても何か助言がありましたら、教えてください。
No.4
- 回答日時:
この件で実用的か分かりませんが、
サーバ側で何かルート権限で実行させてい、かつ、サーバ側に何かプログラムがインストール可能ならsudoコマンドをインストールしてsuコマンドの変わりに使用するのはどうでしょうか?
※参考
【連載】止められないUNIXサーバのセキュリティ対策
第5回 サービスをセキュアにするための利用制限(3)
~管理者権限の制限のためのsuとsudoの基本~
http://www.atmarkit.co.jp/fsecurity/rensai/unix_ …
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にローカルファイルを読み込ませるのは、''の外から<ローカルファイル名でできました。
No.3
- 回答日時:
>$ 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の項目は?となっていて端末が割り当たっていない状態だというのが分かると思います。
Leanさん、ご返信ありがとうございます。
確認しました!
確かに?になっていました!
suコマンドは端末からパスワードを入力しないといけないのですね。
そしてsshコマンド中で生成したプロセスには端末が割り当てられないのですね。
以上より・・・sshコマンド中でsuを実行することは不可能という回答が導き出されたわけですが・・・・。
うーむ、だとしたらどのような代替案をとるべきか・・・。
今、思い浮かんだのは、あらかじめサーバー側に置換のためのスクリプトを用意しておき、ローカルのスクリプトからは単にsshコマンド中でその置換スクリプトを実行するだけにするとか・・・
うーん、あまり格好良くないな~。
ところでLeanさん、つい先日も別の質問にご回答いただきましたね!
聞いてばかりで面目ないです。。。
No.1
- 回答日時:
普通にscpでリモートファイルを上書きするのではダメなのでしょうか?
パスワード無しの公開鍵認証方式にすれば、パスワード入力も省略できます。
astronautさん、ご返信ありがとうございます。
リモートファイルを上書きするのはダメなのです~。
何とかしてリモートファイルの一部をローカルファイルの内容に置換したいのです。
また、パスワード入力を省略するのは避けて、何とか1回のパスワード入力で実現したいのです。
何か良い方法はありませんでしょうか。
もしくは、同スクリプト中で、自動的にパスワード無しの設定をして、当該処理の後にパスワード有りの設定に戻すようなことはできるのでしょうか。
もしご存知でしたら、ぜひ教えていただけないでしょうか。
でも、パスワード無しの設定をするためには公開鍵を、あらかじめサーバーへ転送しておく必要があるのですよね・・・。
そう考えると、どうも同一スクリプト中でこの操作を全部行うのは、難しそうですね。。。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(開発・運用・管理) WindowsからSSHでサーバーにあるファイルをダウンロードできない…。 3 2022/04/24 11:08
- UNIX・Linux Linuxについて質問です。 以下のhistoryの出力結果から、sedコマンドのファイル名tmp1 1 2023/02/03 20:11
- Windows 10 renameコマンドでファイル名からアンダースコアを消す方法 5 2023/04/24 13:33
- UNIX・Linux linuxサーバーのキャッシュをクリアするコマンドを実行したい。 5 2023/01/24 14:52
- Visual Basic(VBA) VBA★PDFをPDFアプリで印刷しようと思っていますが上手くゆきません 1 2022/06/06 22:04
- UNIX・Linux テキストファイルをページ番号付きでコマンドラインから印刷したい 1 2023/02/22 12:47
- Windows 10 ネットワークプリンターにファイルを直接送る方法・コマンドないですか?(´・ω・`) 3 2023/03/13 23:15
- その他(コンピューター・テクノロジー) batファイルでPCの設定内容やプロパティーを取得したいのですが、コマンド1個で1ファイルとなるのを 2 2022/04/27 15:27
- C言語・C++・C# exeファイルが作れない(windows10) 6 2022/08/13 08:47
- その他(プログラミング・Web制作) Linuxについて質問です。 引数に指定されたアクセスログのファイルからアクセス数が多い順に上位3つ 1 2023/02/03 03:46
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
scpコマンドでリモートサーバの...
-
Illustratorのデータをまとめて...
-
Warning: Output is not to
-
DOSコマンドでのワイルドカ...
-
Linux コマンドについて
-
rcpコマンドについて、教えて!
-
ファイルのパーミッションを数...
-
属性変更できないです。
-
/etc/hosts ファイルのリンクに...
-
ユーザアカウントのパスワード...
-
poderosa 操作方法について
-
IBM漢字コードのSJIS変...
-
Sambaで作るディレクトリ容量の...
-
残り日数のカウント方法について
-
Macの Terminal でのエラーと...
-
コマンド履歴のhistoryの記録数
-
Viで書き込もうとすると、保...
-
コマンド終了ステータス
-
書き込み権限が無いためコピー...
-
/etc/passwd と /etc/shadowを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
scpコマンドでリモートサーバの...
-
DOSコマンドでのワイルドカ...
-
Illustratorのデータをまとめて...
-
rcpコマンドについて、教えて!
-
属性変更できないです。
-
AIX ksh利用 grep 検索で マ...
-
Windows10のRegSys32に登録され...
-
Linux shell ftp 転送 エラー制御
-
IBM漢字コードのSJIS変...
-
FTP接続中のコマンド実行結果を...
-
cactiでグラフが表示されない
-
minicomでよく使うコマンド文字...
-
【ターミナル】MacBookにディー...
-
UNIXシェル内での日付計算
-
lsコマンドで表示するファイル...
-
telnet,rlogin,rshの違いってな...
-
残り日数のカウント方法について
-
DOSのAUTOEXEC.BATの書き方、等
-
GNOME端末の起動 及び コマンド...
-
別名でリンク先を保存。
おすすめ情報