シェルスクリプトで他のサーバへSSH接続する方法とサーバ内での処理方法について

このQ&Aのポイント
  • シェルスクリプト内で他のサーバへSSH接続し、サーバ内で別のシェルスクリプトを実行する方法について教えてください。
  • 具体的には、作業PCからサーバAへSSH接続し、root権限でスクリプト1を実行し、その中でサーバA内でスクリプト2を実行し、さらにサーバBへSSH接続してroot権限でスクリプト3を実行する手順について詳しく教えてください。
  • また、参考になるコマンドやサイトがあれば教えていただきたいです。
回答を見る
  • ベストアンサー

シェルスクリプト内で他のサーバへSSH接続

急にシェルスクリプトを組む事になり、勉強を始めて2週間です。 下記について、調べても分からなかった為、教えてください。 どのようなコマンドを使用すればよいのかや、参考になるサイトがありましたら教えてください。 【概要】 シェルスクリプト内で、SSH接続で他サーバへ接続し他サーバ内で別のシェルスクリプトを実行する。その際にroot権限が必要となる。 【環境】 作業PC:Windows サーバA:Linux サーバB:Linux 【スクリプト】 スクリプト1  格納場所:サーバA  処理  :スクリプト1、2を実行 スクリプト2  格納場所:サーバA  処理  :サーバA内でディレクトリ作成等の作業をしてOK/NGを返却 スクリプト3  格納場所:サーバB  処理  :サーバB内でディレクトリ作成等の作業をしてOK/NGを返却 【やりたい事】 1.作業PCからサーバAへSSH接続 2.サーバAでroot権限へスイッチし、スクリプト1を実行 3.スクリプト1は、スクリプト2を実行 4.スクリプト2はディレクトリ作成等の処理を行い、OK/NGを表示 5.スクリプト1は、サーバBへSSH接続 6.スクリプト1は、サーバBでルート権限へスイッチし、スクリプト3を実行 7.スクリプト3はディレクトリ作成等の処理を行い、OK/NGを表示 8.スクリプト1はサーバBからログアウト

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

普通にsshでできるはずですが?サーバーA、サーバーBともにopensshはインストールしてありますよね?もし、インストールしていない場合、「Linux openssh インストール」などで検索してみましょう。 sshのマニュアルで、引数に[command]とあるのを見たことありませんか? http://www.openbsd.org/cgi-bin/man.cgi?query=ssh&sektion=1 これは、例えば次のコマンドを実行すると、user0としてログインした上でlsを実行します。 $ ssh user0@host ls 同様にscript3.shをroot権限で実行するなら、次で良いでしょう。 $ ssh root@host /where/you/put/script3.sh ただ、root権限でのログインをするにはサーバーBにてroot権限でのログインを可能とするよう設定を変更する必要があります。 /etc/sshなどにあるsshd_configを編集し、PermitRootLoginを設定してください。 http://www.openbsd.org/cgi-bin/man.cgi?query=sshd_config&sektion=5 サーバーBのルート権限が奪取されてもあまり気にしないならここでPermitRootLogin yesとしても良いかもしれませんが、おっしゃるような用途で使う場合、PermitRootLogin forced-commands-onlyと設定するのが普通です。 この作業をするためには当然、ssh-keygenでログインするときに使う公開鍵を作っておき、サーバーBの~root/.ssh/authorized_keysに置いてあると思います。(何を言っているのかわからないなら、「ssh 公開鍵 使い方」などで検索してみてください。)このauthorized_keysで、ログインに使用する公開鍵の前にcommand="/where/you/put/script3.sh"を書いておくと、その公開鍵を使ったログインではscript3.shしか実行できなくなり、より安全です。 http://chihungchan.blogspot.jp/2008/08/restrict-ssh-to-run-specific-command.html あと、これも参考になるかもしれません。 http://oreilly.com/catalog/sshtdg/chapter/ch08.html 頑張って。

hiiragi2755
質問者

お礼

ご回答ありがとうございます! ログインはroot以外で行う必要があるんです・・・ 今日もお勉強です。

その他の回答 (2)

  • wormhole
  • ベストアンサー率28% (1619/5653)
回答No.3

>もし、sudoを使用して私がやりたい事の参考になるページをご存知でしたら教えてください。 sudoの使い方調べられましたか? sudoの設定をしておくだけなので、sudoの設定の仕方も含めた使い方の載ってるサイトならどこでも参考になるかと思います。

  • wormhole
  • ベストアンサー率28% (1619/5653)
回答No.2

ログイン自体はroot以外で行う必要がある場合は、 ・sudo を使って実行するスクリプトをroot権限で実行するようにする ・expect を使ってrootにスイッチする などになるかと思います。

hiiragi2755
質問者

お礼

ご回答ありがとうございます。 自分で調べた限りでは、sudo を使うのかな?と思っていました。 しかし、記載するシェルスクリプトのイメージがわかず足踏みしています。 もし、sudoを使用して私がやりたい事の参考になるページをご存知でしたら教えてください。 expect は知りませんでした。 セキュリティ面のメリット・デメリットを含めて調べてみます。

関連するQ&A

  • シェルスクリプト内の「exit」

    クライアントからteratermでservAに接続します。 そこからservBに接続します。 $ ssh servB サーバーBに個人のディレクトリがあり、そこにシェルスクリプトを作っています。 そのシェルスクリプトは「exit 0」で終わっています。 これを実行すると、サーバーBからログアウトしてしまいます。 exitはシェルスクリプト内で使うと、シェルスクリプトを終了するだけかと思ったのですが、ログアウトもしてしまうものなのでしょうか? exitを書かなければ、ログアウトすることなく、カレントディレクトリは変わらないままです。 実行するたびに $ ssh servB $ cd work/mydir と実行しないと自分のディレクトリに戻ってこれないので不便です。 色々と調べたのですが、なぜログアウトしてしまうのかわかりません。 どうすれば、ログアウトしないのか教えて下さい。 よろしくお願いいたします。 シェルスクリプト(TEST) #!/bin/bash -xv echo hello! exit 0 実行結果 [company@servB mydir]$ . TEST hello! Connection to servB closed. [company@servA ~]$

  • シェルスクリプトの作り方

    OSはVineで、bashシェルです。 シェルスクリプトの作り方ですが、 1.ファイルを作る。 例えば、 #!bin/sh cd tmp このとき、ディレクトリはどこでもいいのでしょうか? 2.権限を付ける。 chmod u+x filename 3.実行 ./filename 他に気をつけることはないでしょうか? 実行すると、 bash: ./filename: bad interpreter: そのようなファイルやディレクトリはありません となってしまって、どうしても実行できません。

  • シェルスクリプト間で排他をとりたい

    環境 linux(redhat) 使用シェル bash シェルスクリプトAとシェルスクリプトBを作成し、 シェルスクリプトAが動作している間は、シェルスクリプトBの動作を禁止したいと考えています。 例えば、シェルスクリプトAが起動している状態で、シェルスクリプトBが起動されたとき、シェルスクリプトBは、シェルスクリプトAが起動していることを検知して、自発的に処理を終了するようにしたいと考えています。 上記のような仕組みをシェルスクリプトで実現可能でしょうか? 基本的には、シェルスクリプトの先頭で、ある資源のロックを行い、終了時にロックの解放ができれば、その仕組みは実現可能と考えています。 (シェルの異常終了時は、ロックが自動的に解放されることが望ましい) 上記のようなことをシェル(bash)で実現可能でしょうか。 bash単独での方法、もしくはbashからperl,C言語作成の実行モジュールを呼び出す方法でもかまいません。 (ちなみにperl(もしくはC言語作成のモジュール)単独では実現可能なことはわかっています)

  • 権限の違うシェルスクリプトの実行

    3つのシェルスクリプトがあります。 ●root権限で実行  aaa.csh ●ユーザ指定権限で実行 bbb.csh ●root権限で実行 ccc.csh この3つのシェルスクリプトはaaa.csh →bbb.csh →ccc.cshの順番でバッチ処理として cronに設定したいのですが、 権限が違うのでroot権限のcrontabとユーザ指定のcrontabに それぞれ設定しなくてはいけません。 あまりスマートではないかと思い、 何かよい方法はないかと質問させて頂きました。 3つのシェルスクリプト1つシェルスクリプトにまとめてroot権限のcrontabに設定してしまう方法とかどうでしょうか? ちなみにスクリプトの処理の内容は単純なファイルコピーなどです。 意味分かりますでしょうか? よろしくお願いします。

  • Linuxシェルスクリプトを新しいコマンドにしたい

    Linux初級者です。よろしくお願いします。 OSにFedora Core 10, シェルにtcshを使用しています。 よく使用するコマンドを、まとめて一括で実行するように、 新しいコマンドを作成したくて、次のようなことをしていたのですが (1)ホームディレクトリにmybinというディレクトリを作成してPATHを通す。 (2)newbin1という以下の内容のシェルスクリプトを作成して、~/mybinに置いておく。 ================================== #!/bin/tcsh -f date #実行コマンド例1 echo $PATH #実行コマンド例2 ================================== (3)chmodコマンドでファイルに実行権限を与える。 上記のような方法で、作成したシェルスクリプト(newbin1)を PATHの通ったディレクトリ(~/mybin)に置いて、 > newbin1 とコマンドを呼び出しても、 "newbin1: コマンドが見つかりません" というエラーになってしまいます。 > which newbin1 とすると、ちゃんとファイルのパスが表示されるのですが、 *********************************************************** 自分で作成したシェルスクリプト(newbin1)を、 新しいコマンドとして認識させるにはどのようにすればよいのでしょうか。 また、そもそもシェルスクリプトを新しいコマンドにすることが 不可能だったりするんでしょうか? ************************************************************ 一括で実行したいコマンドが多い場合に、aliasで割り当てるのが大変なので、 できればaliasコマンドは使わずにできる方法を探しています。 基本的な質問かもしれませんが、よろしくお願い致します。

  • シェルスクリプト勉強をしています。

    シェルスクリプト勉強をしています。 シェルスクリプトの条件で指定のディレクトリがAAAというディレクトリが1つしかない場合はスクリプト1を実行し終了させる。 AAAAというディレクトリも含めて複数ある場合(BBBというディレクトリのみでも同様)は別のスクリプト2を実行させる。 例として /home/hoge配下にTargetというディレクトリのみの場合は、スクリプトXを実行した後に終了させる。 Targetディクトリや他のディレクトリもある場合はスクリプトYを実行する。 Targetディレクトリ以外のディレクトリのみだけの場合もスクリプトYを実行する。 Targetディレクトリのみの場合というスクリプトの書き方がわからず… どなたか教えていただけると助かります。 よろしくお願いします

  • 【初心者】シェルスクリプトの引数に関して

    現在、シェルスクリプトを作成しようと奮闘中です。 そこで引数に関してお伺いさせてください。 以下が実施したい内容になります。 (1)./test.sh ⇒引数を指定していないため、「引数を指定してください。」と出力し処理終了 (2)./test.sh daily⇒引数で指定した[daily]の処理を実行 (3)./test.sh weekly⇒引数で指定した[weekly]の処理を実行 (1)~(3)の条件を含んだシェルスクリプトを作成するには、 どのような実行処理が必要かご教授お願いします。 ※処理内容に関しては特に指定はございません。 例: daily=特定ディレクトリのコピー weekly=dailyで処理したディレクトリをtarで圧縮し別のディレクトリへ移動 など分かりやすい内容だと幸いです。 また、情報に不備などがありましたらご指摘おねがいします。

  • シェルスクリプト(Bash偏)の実行ファイルに関するご質問があります。

    シェルスクリプト(Bash偏)の実行ファイルに関するご質問があります。 ファイル名を変更するシェルスクリプトをbashで行おうとプログラムを作成したのですが、 実行するとbad interpreter: ディレクトリではありません とメッセージが出て終了します。記述に誤りがあるのか、実行の仕方が悪いのか分かりません。教えて下さい。 シェルの記述内容は ファイル名をtest.sh #!/bin/bash/ -f mv A.txt A.ori exit 実行方法として #>chmod x+a test.sh #>./test.sh で行いました。そうしたら、bad interpreter: ディレクトリーではありません とメッセージが出ます。 ちなみに #>. test.sh で実行するとターミナルがシェルの実行と同時に閉じてしまいますが、シェルを実行したディレクトリーを確認すると、処理が終わっておりました。

  • 他ユーザーのシェルスクリプト実行

    他ユーザーのシェルスクリプトを実行する際に「rsh」や「ssh」を使用しないで実行 する方法が知りたいです。 また、シェルはCのプログラムから実行させたいのでパスワードの入力を求められたり するのは避けたいです。 フルパスを直接指定すれば実行は出来ましたが、ユーザーが変わっていないので ほしい結果が得られませんでした。 OSはredhat linuxです。

  • シェルスクリプト 引数の引渡しについて

    こんにちは。現在シェルスクリプトを勉強中なのですがどうしてもわからないことがあり投稿させていただきました。 シェルスクリプトにて作成した引数(引数にスペースがある場合)を別のシェルスクリプトへ渡そうとしたときにうまく引き渡せなくて困っています。 詳しくは以下のスクリプト参照願います。 (1)引数作成のスクリプト _/_/_/_/_/_/_/_/_/_/_/_/ #!/bin/sh a="HELLO" b="\"WOW WOW\"" test.sh $a $b _/_/_/_/_/_/_/_/_/_/_/_/ (2)test.sh _/_/_/_/_/_/_/_/_/_/_/_/ #!/bin/sh echo $1 echo $2 echo $3 _/_/_/_/_/_/_/_/_/_/_/_/ これを実行すると $1=HELLO $2="WOW $3=WOW" となってしまいます。 これを $1=HELLO $2=WOW WOW $3=NULL(空欄) となるようにシェルスクリプトで作成することはできないのでしょうか? ご教授よろしくお願いします。 よろしくお願いします。