他のUNIX/Linuxマシンを操作する際、大体はこのssh(open-ssh)を用いるだろう。 今回は、そんなssh接続のクライアントソフトであるsshコマンドについて、覚えておきたい使い方について紹介する。
なお、-oでしている箇所については、「/etc/ssh/ssh_config」で包括的に設定可能な項目となる。
1.基本の使い方
まずは基本の使い方から。 以下のように記述することで、ssh接続を行う。
ssh ユーザ名@接続先のホスト名(IPアドレス)
以下のように記述することもできる。
ssh 接続先のホスト名(IPアドレス) -l ユーザ名
sshコマンドを実行しているユーザと、ログインするユーザが同じ場合は、ユーザ名は省略することができる。
ssh 接続先のホスト名(IPアドレス)
2.初めてアクセスするホストの時に出力される警告を無視する
sshコマンドで、対象のホストに初めて接続する場合、以下のような警告メッセージが出力される。
$ ssh root@test-vm-ubuntu
The authenticity of host 'test-vm-ubuntu (192.168.0.XXX)' can't be established.
ECDSA key fingerprint is 09:f3:XX:de:XX:8f:6d:XX:ef:f1:XX:ec:XX:42:XX:b7.
Are you sure you want to continue connecting (yes/no)?
このメッセージは、sshコマンドを実行しているユーザのknown_hostsにこのホストが入っていないため、本当に接続していいのかを確認する警告メッセージだ。 出力させないようにするには、以下のオプションを付与する。
ssh ユーザ名@接続先のホスト名(IPアドレス) -o "StrictHostKeyChecking=no"
なお、このオプションは対象のリモートホストのフィンガープリントが変わった際にも有効だ。 例えば、サーバ自体を再構築したため、ホスト名は同じだけど、OSもろとも入れなおしたマシンにアクセスすると、以下のように警告が表示される。
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
99:3b:XX:b9:4b:XX:54:82:cb:15:XX:27:f8:XX:02:70.
Please contact your system administrator.
Add correct host key in /Users/user/.ssh/known_hosts to get rid of this message.
Offending RSA key in /Users/user/.ssh/known_hosts:2
RSA host key for 192.168.0.108 has changed and you have requested strict checking.
Host key verification failed.
このメッセージも、上記のオプションで無視することが出来る。 (セキュリティの事を考えると、一般公開しているサーバへの接続に対しては、使用しない方が良いとは思うが…)
3.ssh接続時の操作ログを取得する
ssh接続時の操作ログをコマンド実行側で取得させるには、teeコマンドと組み合わせればよい。 (なお、このログはリアルタイムで記述される。)
ssh ユーザ名@接続先のホスト名(IPアドレス) | tee -a /記述させるログのパス
なお、sshサーバ側でログを取得させたい場合は、こちらを参考にしてもらいたい。
4.踏み台サーバ経由でログインを行う
特定のサーバにログインする際、踏み台サーバという別サーバを経由してログインするような環境もあるだろう。 そのような場合は、「ProxyCommand」を用いる事で簡単にログインすることが可能になる。
ssh ユーザ名@接続先のホスト名(IPアドレス) -o 'ProxyCommand ssh 踏み台サーバのユーザ@踏み台サーバのホスト名 nc %h %p'
実際に利用してみたのがこちら。 公開鍵認証の設定をしてなくても、接続先、踏み台ともにパスワードを聞いてくれるので接続可能だ。
以下の例では、「192.168.0.211」を踏み台に「192.168.0.226」に接続を行っている。
[root@localhost ~]# ssh root@192.168.0.226 -o 'ProxyCommand ssh test@192.168.0.211 nc %h %p'
test@192.168.0.211's password:
root@192.168.0.226's password:
Last login: Sat Feb 7 19:33:09 2015 from 192.168.0.211
[root@localhost ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:f5:dd:a9 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.226/24 brd 192.168.0.255 scope global ens192
valid_lft forever preferred_lft forever
inet6 240f:7:63e5:1:20c:29ff:fef5:dda9/64 scope global dynamic
valid_lft 290sec preferred_lft 290sec
inet6 fe80::20c:29ff:fef5:dda9/64 scope link
valid_lft forever preferred_lft forever
5.クライアント側のパスワード入力試行回数を増やす
sshコマンドでの接続では、通常はパスワードを3回間違えると接続を諦めるようになっている。 この回数を増やすには、「NumberOfPasswordPrompts」を用いる事。
ssh ユーザ名@接続先のホスト名(IPアドレス) -o 'NumberOfPasswordPrompts パスワードの試行回数'
なお、当然だがこれはあくまでもクライアント側の設定。 当たり前だが、サーバ側で指定されたパスワードの試行回数を超えた結果、ロックがかかる事を回避出来るわけではないので勘違いしないように。 (大丈夫だと思うけど)
6.ssh接続時に直接コマンドを実行する
sshコマンドでは、ユーザ名・接続先ホストのみを指定した場合は、そのままコンソールにログインする。これが通常の利用方法になるのだが、ただ決まったコマンドだけを実行させることも出来る。 以下のようにすることで、接続先で直接コマンドを実行させることが可能だ。
ssh ユーザ名@接続先のホスト名(IPアドレス) '接続先で実行させるコマンド'
以下の例では、接続先(192.168.0.240)の設定ファイル(/etc/sysconfig/network-scripts/ifcfg-eth0)を出力させている。
むろん、他のコマンド(echoでの追記やpsでのプロセス確認など)も可能だ。
7.ssh接続先とローカルマシンの間でdiffを行う
ssh接続先のリモートマシンとローカルマシンの間でdiffを行う事も出来る。
ssh ユーザ名@接続先のホスト名(IPアドレス) "cat リモート側のファイルパス" | diff - ローカル側のファイルパス
その他の方法や、詳細な内容については、こちらを参照してもらいたい。
8.ssh接続先のフォルダをtar.gzで圧縮して持ってくる
ssh接続先が持っているフォルダを、事前にリモート先で圧縮せずに、そのままtarにして取得することも出来る。
ssh ユーザ名@接続先のホスト名(IPアドレス) "tar -cf - /アーカイブ化したいディレクトリのパス" | gzip > /ローカル側で作成するアーカイブ・ファイルのパス
その他、リモート→ローカル、ローカル→リモートでのコマンドについては、こちらを参照。
9.ssh接続先のファイルにローカル側で持っているファイルを追記させる
ssh接続先が持っているファイルに対し、ローカルマシン側で持っているファイルの内容を追記させることも出来る。
ssh ユーザ名@接続先のホスト名(IPアドレス) "cat >> /追記するリモートファイルのパス" < /追記させるローカルファイルのパス
使いドコロとしては、鍵認証をの設定を行う際に秘密鍵を追記する時に使えるだろう。
10.ローカル側で持っているスクリプトをリモート先で実行させる
ローカル側にしかないスクリプトを、リモート先で実行させることも出来る。
ssh ユーザ名@接続先のホスト名(IPアドレス) 'sh ' < スクリプトのパス
'sh 'の箇所については、'sh -x'でも'bash -x'でも、ローカル側でスクリプトを実行させるプログラムであれば何でもいい。 詳しくはこちらに記述している。
以上910個の使い方を紹介させてもらった。
とはいえ、まだまだおもしろい使い方がいっぱいあるだろう。
他に使い方を知っている人がいたら、教えてください。