いますぐ実践! Linuxシステム管理

いますぐ実践! Linux システム管理 / Vol.280 / 読者数:2829名

こんばんは、うすだです。

かなり久しぶりに、家族で2泊3日の旅行をしてきました。
(泊まりがけでは、実に7年ぶりの家族旅行でした。)

我が家で旅行をするとなると、お金と、家族みんなの休暇を合わせる、 という問題の他に、飼っているオカメインコさんたちの世話をどうするか、 という大きな問題が立ちはだかります。

本来、鳥は、2〜3日くらいなら、人間がいなくても問題ありません。
その間の餌と水を置いておけば、必要な分だけ勝手に食べてくれます。

…ですが、我が家の鳥さんたちは、人間がご飯を食べているときしか餌を食べない、 という困った習性があります。

ですので、嫁の知り合いで、鳥の世話の経験が豊富な方に、 ちょくちょく来てもらうことにしました。

さらに、スマホから映像をみたり方向を変えられるカメラと、 ラズパイにカメラをつないだものを部屋に設置し、 旅先から映像で確認できるようにしました。 (後者は、前者が動かなかったときのための予備です。)

これらのおかげで、比較的安心して旅行することができました。

あとは、カーテンの開け閉めを遠隔でできれば完璧だったと思います。
次の旅行までに、ラズパイか何かで実現したいと考えています。

…次の家族旅行はもうないかも…ですが、今回もはりきってまいります。

今回のお題 - SSH を使って複数のマシンで処理をする (レベル:初級)

今回こそは、Kubernetes の最終回を…と思っていたのですが、現在出張中で、 試すことすらできておりません。

そのため、最近、SSHを使って実際に行ったことを、まとめてご紹介することで、 お茶を濁し…もとい、代わりとさせていただきたいと思います。

普段、sshコマンドを、 リモートマシンへログインするためのものとして使っておられるのではないかと思います。 (少なくとも私はそうです。)

ですが、引数にコマンドを指定すると、 そのコマンドを実行したら終わりにすることができます。
たとえば、sshの実行時にlsコマンドを引数に指定すると、 lsコマンドを実行して終了した時点でログアウトします。

  $ ssh remote_machine ls
  fox@remote_machie's password:
  nohup.out
  tmp
  $

これを利用して、複数のマシンに処理を行わせると、いろいろ便利です。
…という感じの、もやっとした内容を今回はお送りします。

パスフレーズなしの鍵ペアを作る

本題に入る前に、パスフレーズなしのSSHの鍵ペアを作り、 SSHでログインする際にその鍵を使うようにしてみましょう。

パスフレーズなしの鍵ペアを作らなくても、後述の例を実行できますが、 実行時に毎回パスワードを聞かれるため、ちょっと面倒です。
また、cron などで自動的に実行することができないため、不便です。

SSHの鍵ペアを作るには、「ssh-keygen」コマンドを使います。
そのまま実行すると、保存するファイル名とパスフレーズを聞かれます。
パスフレーズを入力せずリターンキーだけを押すと、 パスフレーズなしの鍵ペアを作成できます。

  $ sshe-keygen
  Generating public/private rsa key pair.
  Enter file in which to save the key (/home/fox/.ssh/id_rsa): 
  Enter passphrase (empty for no passphrase): (リターンキーを押す)
  Enter same passphrase again: (リターンキーを押す)
  Your identification has been saved in /home/fox/.ssh/id_rsa.
  Your public key has been saved in /home/fox/.ssh/id_rsa.pub.
  The key fingerprint is:
  SHA256:AB0C1DEfghi/2jk3lMNOPQRs45tuVwxYZA6BcDEFghI fox@room42
  The key's randomart image is:
  +---[RSA 2048]----+
  |  .+.+     ..= .=|
  ...
  |         o .    .|
  +----[SHA256]-----+

ホーム直下の「.ssh」というディレクトリに、 秘密鍵である「id_rsa」と公開鍵である「id_rsa.pub」ができます。
(鍵のファイル名を明示的に指定していれば、その名前になります。)

  $ ls -l ~/.ssh/id_rsa ~/.ssh/id_rsa.pub
  -rw------- 1 fox fbi 1675 10月  7 21:54 /home/fox/.ssh/id_rsa
  -rw-r--r-- 1 fox fbi  393 10月  7 21:54 /home/fox/.ssh/id_rsa.pub

これを、「myserver」というマシンへログインするときに使うようにするには、 SSHの設定ファイル「~/.ssh/config」に以下を追加します。
(ファイル名が異なる場合は、適宜変更してください。)

Host myserver
IdentityFile ~/.ssh/id_rsa
IdentitiesOnly yes

もし config ファイルがなければ、下記のように作成します。
自分しか見ることのできないパーミッションにしておきます。

  $ cat > ~/.ssh/config << EOF
  Host myserver
  IdentityFile ~/.ssh/id_rsa
  IdentitiesOnly yes
  EOF
  $ chmod go-rwx ~/.ssh/config

そして、myserverの「~/.ssh/authorized_keys」に公開鍵を追加します。
id_rsa.pubをコピーした後、authorized_keysがある場合は追記します。

  $ cat id_rsa.pub >> authorized_keys

ない場合は、id_rsa.pub を authorized_keys にします。
自分以外の人には見られないよう、パーミッションを変更します。

  $ mv id_rsa.pub authorized_keys
  $ chmod go-rwx authorized_keys

試しに、myserver へログインし、 パスフレーズの入力なしでログインができることを確認します。
なお、そのマシンに SSH で一度もログインしたことがない場合、 以下のように known_hosts ファイルへサーバの鍵を追加するか聞かれます。

  $ ssh myserver
  The authenticity of host 'myserver (192.168.1.1)' can't be established.
  ECDSA key fingerprint is SHA256:秘密.
  Are you sure you want to continue connecting (yes/no)? yes
  Warning: Permanently added 'myserver,192.168.1.1' (ECDSA) to the \
  list of known hosts.
  Last login: Sat Oct  6 23:34:32 2018 from 192.168.1.2
  $

それでは、いくつか例を示していきます。

音声入力と出力を別のマシンで行う

冒頭の旅行時に、出先で、こちらの声を、家にいる鳥さんに聞かせたり、 逆に鳥さんの声を聞きたい、というニーズがありました。

前者の場合、ローカルホストで音声を入力し、 リモートマシン(myserver)でその音声を再生できればよいですよね。

というわけで、以下のように実行すれば、実現できます。

  $ arecord | ssh myserver aplay

ローカルホストで「arecord」コマンドにより入力した音声を、 パイプで標準出力に渡します。
それを受け取るのは、myserver で起動した「aplay」コマンドです。

逆に、後者の場合は、 リモートマシンで入力した音声をローカルホストで再生すればよいですね。それには、 以下のように実行します。

  $ ssh myserver arecord | aplay

メールサーバでメールを出す

ローカルホストではメールを出せないけれど、メールサーバにログインをすれば、 「Mail」コマンドなどでメールを出せる、という場合、 メールの内容を渡してMailコマンドを実行すれば、解決します。

たとえば、dfコマンドの出力を「dana」さんにメールで送るには、 以下のように実行します。

  $ df -h | ssh myserver Mail -s 'df\ of\ localhost' dana

ディレクトリやファイルにWebでアクセスできるか確認する

Webサーバにあるディレクトリやファイルに、HTTPでアクセスできるか、 あるいはできないかどうかを、確認してみましょう。

たとえば、ドキュメントルート「/var/www/html」 の直下にあるファイルやディレクトリにアクセスできるかどうかを確認するには、 以下のように実行します。

  $ ssh myserver ls -1a /var/www/html | while read file; do
  > wget -q -O /dev/null http://myserver/$file
  > echo $file : $?
  > done
  . : 0
  .. : 0
  .htaccess : 8
  css : 0
  fonts : 0
  index.html : 0
  secret : 6
  public : 0

/var/www/html直下のファイルまたはディレクトリと、 「wget」コマンドでアクセスしたときの終了コードを出力しています。

終了コードが 0 の場合は、アクセスできています。
6 の場合は、認証が必要なためアクセスできていません。
8 の場合は、Webサーバがエラーを返しておりアクセスできていません。

つまり、.htaccessやsecretにアクセスできていないことになりますが、 その名前から推測する限りでは、正しい動作のように思われます。

さらに、その結果をメールサーバに渡してメールしてもらってもよいかもしれません。

  $ ssh webserver ls -1a /var/www/html | while read dir; do
  > wget -q -O /dev/null http://myserver/$dir
  > echo $dir : $?
  > done | ssh mailserver Mail -s 'web\ access\ result' john

おわりに

以上、SSHを使って複数のマシンに処理させる方法をご紹介しました。

ようするに、データを標準入出力で扱えるなら、 SSHとパイプを使用して別のマシン同士でやりとりできる、ということです。

あとは使い方次第です。いろいろ思案してみてください。

宿題の答え

前回の宿題は、

  上限を超えた数の引数を指定してxargsが動くことを確認しましょう。

でした。

前回おしらせしましたが、上限は getconf ARG_MAX で得られます。

  $ getconf ARG_MAX
  2097152

実行できるかどうかを確認したいだけなので、seq コマンドで数字の羅列を作り、 これを渡してみたいと思います。

  $ echo $(seq $(getconf ARG_MAX))
  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 \
  25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 \
  ...
  2097139 2097140 2097141 2097142 2097143 2097144 2097145 2097146 \
  2097147 2097148 2097149 2097150 2097151 2097152

これを引数に指定して ls コマンドを実行しようとすると、 以下のように叱られてしまいました。

  $ ls $(seq $(getconf ARG_MAX))
  bash: /bin/ls: 引数リストが長すぎます

ですが、xargs コマンド経由だと、叱られることなく実行できます。

  $ seq $(getconf ARG_MAX) | xargs ls
  ls: '1' にアクセスできません: そのようなファイルやディレクトリはありません
  ls: '2' にアクセスできません: そのようなファイルやディレクトリはありません
  ls: '3' にアクセスできません: そのようなファイルやディレクトリはありません
  ...
  ls: '2097151' にアクセスできません: そのようなファイルやディレクトリはありません
  ls: '2097152' にアクセスできません: そのようなファイルやディレクトリはありません

なお、先ほど、echo コマンドでは実行できてしまっていますが、 これはシェルの内部コマンドだからだと思われます。/bin/echo で試すと、 以下のように実行されません。

  $ /bin/echo $(seq $(getconf ARG_MAX))
  bash: /bin/echo: 引数リストが長すぎます

もちろん、xargs 経由だと、実行できます。

  $ seq $(getconf ARG_MAX) | xargs /bin/echo
  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 \
  25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 \
  ...

今回の宿題

今回の宿題は、

  「df -h | ssh myserver Mail -s 'df\ result' dana」のように空白の
  手前に「\」を入れているのはなぜか調べてみましょう。

です。

「\」を削るとどうなるかを、まず試してみていただければと思います。

あとがき

というわけで、現在、ホテルでこれを書いております。

クリーニングサービスを利用したり、自分で洗濯をすればいいやと思い、 着替えをあまり持ってきていません。

ですが、ここのところ暑い日が続いており、思ったよりも着替えが必要になっております。

そして、悲しいことに、 泊まっている&泊まる予定のホテルにはいずれもクリーニングサービスがないため、 外のクリーニング屋さんを利用せざるをえません。

まだ近くにクリーニング屋さんがあるうちはよいのですが、 明日から行くホテルの周辺には、クリーニング屋さんがありません。
いえ、クリーニング屋さんどころか、あらゆる店がほとんどありません。

仕方がないので、今日、シャツとズボンを急遽買いに行きました。
しかし、そんなときですら、なるべく安く済ませたい、 という欲を捨てることができず、あちこちの店を探し回ってしまいました。

結局、ユニクロと某紳士服屋さんのワゴンから召喚しました。
日本の景気をよくする行為とかけ離れていること、時間と体力を浪費したことに、 深く反省しております。

 

今回も、ここまで読んでいただき、誠にありがとうございました。
次回は、11月4日に発行したいと思っております。

 

「いますぐ実践! Linux システム管理」はこちらです。
メルマガの解除、バックナンバーなども、以下からどうぞ。
http://www.usupi.org/sysad/ (まぐまぐ ID:149633)

その他、作者に関するページは、概ね以下にございます。
http://www.usupi.org/kuri/ (まぐまぐ ID:126454)
http://usupi.seesaa.net/ (栗日記ブログ)
http://twitter.com/kuriking/ (twitter)
http://facebook.com/kuriking3 (facebook)
https://jp.pinterest.com/kuriking/ (pinterest) https://www.instagram.com/kuri_king_/ (instagram)


[バックナンバーのトップへ] [Linux システム管理のトップへ]

トップ

バックナンバー
    [日付順] [目的別]

プロフィール

▼ リンク

独学Linux
Linuxデスクトップ環境に関する情報が満載です。 メルマガもありますよ。
Server World
CentOS 6をサーバとしたときの設定例が、これでもかというくらいたくさん載っています。 CentOS以外のディストリビューション(Fedora, Ubuntu)も充実しています。
LINUXで自宅サーバーを構築・導入(Fedora9)
Fedora9のインストールの仕方から管理方法まで、詳しく載っています。 SearchManには情報がもりだくさんです。
マロンくん.NET
〜サーバ管理者への道〜
Linuxをサーバとして使用するための、いろいろな設定方法が載っています。 マロンくんもかわいいです。 なんといっても、マロンくんという名前がいいですね!!
日経Linux
今や数少なくなってしまったLinuxの雑誌。ニュースやガイドもあります。
Linux Square − @IT
@ITが提供する、Linux の情報が満載。 載っていない設定方法はないんじゃないでしょうか。
gihyo.jp…技術評論社
Linuxに限らず様々な技術情報が満載のサイト。 SoftwareDesign誌も、 ソフトウェア技術者は必見です。
SourceForge.JP Magazine
Linux に限らず、オープンソース関連の記事が網羅されています。
ITmediaエンタープライズ:Linux Tips 一覧
Tips というより FAQ 集でしょうか。わからないことがあれば覗きましょう。
IBM developerWorks : Linux
開発者向けですが、勉強になりますよ。
栗日記
システム管理とかと全然関係ありませんが、毎日栗の絵を描いています。
システム管理につかれちゃったとき、癒されたいときに、ご覧ください。:-)
WEB RANKING - PC関連
ランキングに参加してみました。押してやってください。

▼ 作ってみました

Add to Google

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本