treedown’s Report

システム管理者に巻き起こる様々な事象を読者の貴方へ報告するブログです。会社でも家庭でも"システム"に携わるすべての方の共感を目指しています。

※https化しました。その影響でしばらくリンク切れなどがあるかもしれませんが徐々に修正していきます。 リンク切れなどのお気づきの点がございましたらコメントなどでご指摘いただけますと助かります。

Linuxで簡単sshコマンド実行

今日はsshコマンドを簡単に実行するためのちょっとしたシェルを作成するために、シェルで変数の使い方をご報告します。
そんなに難しいことはやっていないです。初歩の初歩。

作ったシェル

sshコマンドを覚えればそれでいいんですが、sshコマンドはコマンドラインになれていないユーザに覚えてもらえない、そこでシェルにしていちいち入力しなきゃいけない値を画面出力して対話型でsshコマンドが実行できるようにする、という狙いです。
環境はDebian Jessieでやりましたが、どのLinuxでも使える汎用的なものです。

さっそくですが中身。
$ cat term.shで表示した内容です。
----------------------------------------------
   term.sh
----------------------------------------------
#!/bin/sh
echo "アクセス先IPを入力"
read IPaddr
echo "アクセス先ユーザ名を入力"
read USERNAME
echo "${IPaddr}へ${USERNAME}でアクセスします。"
ssh $USERNAME@$IPaddr
----------------------------------------------

■解説

1行目:「#!/bin/sh」でシェル宣言
2行目:echoでアクセス先のIP入れてね、とメッセージを画面に出し、
3行目:入力待ち、ここで入力された値を変数IPaddrに代入
4行目:echoでアクセス先のユーザ名を入力促すメッセージ表示し、
5行目:入力待ち、ここで入力された値を変数USERNAMEに代入
6行目:一応アクセス先IPアドレスとアクセスユーザ名を表示して
7行目:sshコマンドに代入された変数を当てはめてsshコマンドを実行する

という簡単なもの。

これバッチファイルだと
----------------------------------------------
set /p IPaddr="アクセス先IPを入力"
set /p USERNAME="アクセス先ユーザ名を入力"
----------------------------------------------
という具合に入力部と変数名に代入するのは1行でできるのですが、シェルだとechoでメッセージ表示し、次の行にreadコマンドで入力値を待ち受ける(変数に代入)という2行が必要、ということみたいですね。

もうちょっとイイ感じに

これだけだと何の役にも立たない知識、となる可能性があるので、もうちょっと。

if文を使って入力しなかった時にデフォルト値を取得するようにしてみます。
こんな感じで変更します。

----------------------------------------------

#!/bin/sh
echo "アクセス先IPを入力"
read IPaddr
echo "アクセス先ユーザ名を入力(デフォルトSSH-User)"
read USERNAME
if ["${USERNAME}" = ""]; then
     USERNAME="SSH-User"
fi
echo "${IPaddr}へ${USERNAME}でアクセスします。"
ssh $USERNAME@$IPaddr

----------------------------------------------

変更したのは
if ["${USERNAME}" = ""]; then
     USERNAME="SSH-User"
fi
を付け加えたこと、つまりアクセス先ユーザを入力しなかった場合、デフォルトのユーザ名として「SSH-User」というユーザ名を使ってログインしますよ、という動作になるようにしたわけです。
変数を使うときに "$[変数名]" という具合に変数名を囲むのは他の使い方と同じなんですが、if文を使うときにちょっと失敗したのは、
 if ["${USERNAME}" = ""]; then
という行で、「=」の使い方が間違っていました。
○○=○○とするときに、イコール前とイコール後ろの間はスペースを挿入して区切り文字をいれないと、条件式として=は動作しません。
実行すると、エラー「./term.sh: 6: ./term.sh: [=]: not found」となってしまいます。

バッチファイルはいろいろ作りましたがシェルスクリプトはまだまだ初心者レベルなので、ちょっとづつやっていこう、と思いました。
とかく今日はif文の比較式「= イコール」は前後に半角スペース(空白)を入れること、これを忘れないようにしておきます。