LoginSignup
3
3

More than 5 years have passed since last update.

ローカルネットワーク内マシンのMACアドレスからSSHログイン

Last updated at Posted at 2017-07-08

投稿直後に致命的なミスを見つけたので再投稿です

目的

RaspberryPiのような頻繁に持ち運んだりOS吹っ飛ばしたりするようなマシンのIPアドレスを固定するのも面倒なので、MACアドレスから動的に割り振られたipアドレスを参照してsshログインします。

やること

  • arpでログインしたいマシンのipアドレスを調べる。
  • gawkでarpの標準出力からipアドレス部分を切り出す。ユーザ名を指定する場合ここで指定する
  • 切り出したipアドレスにsshでログインする。
    これをone-linerでやっていきます。
    bash arp |grep "mac_address"|gawk 'gensub(/(\s*?)(\S+)/,"\2","") {print "user@" $1}'|xargs ssh -t -t

長いのでaliasに登録するとすっきりします。結局面倒なので本末転倒感が
クォーテーションのエスケープ(特にgawk)を忘れずに。

追記

上の書き方だとログインまではできますがリモートホストでのコマンド実行ができません。
BSD版xargsであれば-oオプションを付加するだけで対応できますが、GNU版の場合は以下のようになります。

arp|grep "mac_address"|gawk 'gensub(/(\s*?)(\S+)/,"\2","") {print "user@" $1}'|xargs sh -c 'ssh "$@" </dev/tty' ssh

Bash on Windows環境の場合(Creators Updateでは要検証)

linuxのarpコマンドが使えないためWindowsのarpを使用します。
cbwin(wsl-terminalに同梱)を使用すればwcmd COMMANDでWindowsのコマンドをbashのterminal上から使えます。
今回の場合、先頭のarpwcmd|arp -aに書き換えればokです
bash
wcmd arp -a|grep "mac_address"|gawk 'gensub(/(\s*?)(\S+)/,"\2","") {print "user@" $1}'|xargs sh -c 'ssh "$@" </dev/tty' ssh

注意点

xargssshに引数を渡して実行する際に-tオプションが2つ必要になります。
スクリプト内でsshを実行しているため、-tオプションが付いていない場合

Pseudo-terminal will not be allocated because stdin is not a terminal.

とwarningが出てリモートホストのシェルには入れません。
-tオプションが2つ必要になる理由はわからなかったです。

追記を参照してください。

参考文献

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3