Networkで使われているIP Addressをbashで調べる方法
Networkで使われているIP Addressをbashで調べる方法
nmapかarp-scanを入れたら簡単にできるらしいですが、bashで行けないかなと思いました。
pingを全IP Addressに送信して、arpを見ればいけそう。
# for i in `seq 1 254`; do ping -c1 192.168.10.${i} > /dev/null & done # arp アドレス HWタイプ HWアドレス フラグ マスク インタフェース 192.168.10.1 ether xx:xx:xx:xx:xx:xx C wlp1s0 192.168.10.2 ether yy:yy:yy:yy:yy:yy C wlp1s0
自分のSSH 使い方変遷
自分がこれまでに辿った、SSHの使い方を整理してみる。
SSH 原始時代
愚直にパスワードを入力してログインしてた頃。-lでユーザを指定するより、@で指定するのが覚えやすかったため、@を使用する派。
$ ssh <user>@<remote-host> Password: <remote-host> $
SSH 石器時代
前時代の方法だと、ログインするたびにパスワードを入力しないといけなくて、それだと手間なので、公開鍵認証を覚えた。
公開鍵認証では、公開鍵をリモートホストに事前に登録しておけば、以降はローカルホストの秘密鍵を指定して接続すればパスワードなしでログインできる。自分としては、公開鍵というより公開錠前と考えたほうがイメージし易かった。公開錠前を接続したいホストにコピーして配布して、秘密鍵で公開錠前を開けるイメージ。
ssh-keygenコマンドで作成される~/.ssh/id_rsaが秘密鍵、~/.ssh/id_rsa.pubが公開鍵。パスフレーズの入力が求められるが、これは秘密鍵を使うためのもので、リモートとのやり取りには関与しないらしい。zipにかけるパスワードのようなものなので、なくても良いはず。
$ ssh-keygen -t rsa Generating public/private rsa key pair. Enter passphrase (empty for no passphrase): Enter same passphrase again:
公開鍵のリモートホストへの登録は、公開鍵(~/.ssh/id_rsa.pub)の内容を、リモートホストの~/.ssh/authorized_keysに追記することで実施する。~/.ssh/authorized_keysがない時は、新規作成して、パーミッションを600に設定する。このあたりの処理はssh-copy-idを使うと、リモートホストのauthorized_keysへの書き込みを自動で実施してくれる。
$ ssh-copy-id <user>@<remote-host> /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/<user>/.ssh/id_rsa.pub" /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys <user>@<remote-host>'s password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh '<user>@<remote-host>'" and check to make sure that only the key(s) you wanted were added.
SSH 青銅器時代
前時代の方法だと、ログインするときに秘密鍵を指定しないといけない。それに、ユーザ名とリモートホストを入力するのも面倒になってきた。
$ ssh -i ~/.ssh/id_rsa <user>@<remote-host>
それだと手間なので、~/.ssh/configに設定を書くことを覚えた。
Host remote-host HostName <remote-host> IdentityFile ~/.ssh/id_rsa User <user>
これでタイプする量が減って、かなり楽になった。
$ ssh remote-host
SSH 鉄器時代
秘密鍵に設定できるパスフレーズもあったほうが良い気がしてきた。かと言って、接続のたびにパスフレーズを打つ気にはならない。
なので、ssh-agentを使うことを覚えた。
ssh-agentを起動して、ssh-agentに秘密鍵を渡しておくと、以降の秘密鍵を使用する際にパスフレーズを入れる必要がなくなる。
まずは、ssh-agentを起動する。
$ eval `ssh-agent`
ssh-agentに秘密鍵を追加、それと秘密鍵を持っているかを確認する。
$ ssh-add ~/.ssh/id_rsa Enter passphrase for /home/<user>/.ssh/id_rsa: Identity added: /home/<user>/.ssh/id_rsa (/home/<user>/.ssh/id_rsa) $ ssh-add -l 2048 SHA256:f4l2f1eJfZnICjvpEfmV3KsiE2Xat7eYn3leJOnLGv1 /home/<user>/.ssh/id_rsa (RSA)
さらにssh-agentが強力なのが、リモートホストに秘密鍵を持ってきてくれる機能。ssh-agentが秘密鍵を持ってきてくれるので、踏み台サーバの先にいる目的のリモートホストに公開鍵を登録しておけば、パスワードなしでログインできる。
ssh利用時に-Aオプションを付けると、ssh-agentがリモートホストに秘密鍵を持ってきてくれる。なお、-Aオプションを入れるのが億劫な場合は、.ssh/configにForwardAgent yes
を追加しておくと良い。
$ ssh -A remote-host remote-host$ ssh-add -l 2048 SHA256:f4l2f1eJfZnICjvpEfmV3KsiE2Xat7eYn3leJOnLGv1 /home/<user>/.ssh/id_rsa (RSA)
ssh-agent起動は、.bashrcに書いておいて自動実行すると良いらしい。なお、ssh-agentは、OS起動時に既に起動している場合があるので、その場合ssh-agentの起動は実行不要。
# start SSH agent ssh-add -l &>/dev/null if [ "$?" == 1 ]; then test -r ~/.ssh-agent && \ eval "$(<~/.ssh-agent)" >/dev/null ssh-add -l &>/dev/null if [ "$?" == 1 ]; then (umask 066; ssh-agent > ~/.ssh-agent) eval "$(<~/.ssh-agent)" >/dev/null fi fi
あと、以下のaliasを書いておけば、初回のssh実行時にのみssh-addを実行できるので便利。
# add ssh-add to SSH command alias ssh='ssh-add -l &>/dev/null || ssh-add && unalias ssh; ssh'
おわりに
SSHについては、まだまだ知らないだけで進化の余地ありそう。暇があれば調査してみたいと思う。