投稿直後に致命的なミスを見つけたので再投稿です
目的
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上から使えます。
今回の場合、先頭のarp
をwcmd|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
注意点
xargs
でssh
に引数を渡して実行する際に-t
オプションが2つ必要になります。
スクリプト内でssh
を実行しているため、-t
オプションが付いていない場合
Pseudo-terminal will not be allocated because stdin is not a terminal.
とwarningが出てリモートホストのシェルには入れません。
-t
オプションが2つ必要になる理由はわからなかったです。
追記を参照してください。