投稿直後に致命的なミスを見つけたので再投稿です
目的
RaspberryPiのような頻繁に持ち運んだりOS吹っ飛ばしたりするようなマシンのIPアドレスを固定するのも面倒なので、MACアドレスから動的に割り振られたipアドレスを参照してsshログインします。
やること
-
arp
でログインしたいマシンのipアドレスを調べる。 -
gawk
でarpの標準出力からipアドレス部分を切り出す。ユーザ名を指定する場合ここで指定する - 切り出したipアドレスに
ssh
でログインする。
~~これをone-linerでやっていきます。
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](https://github.com/xilun/cbwin)([wsl-terminal](https://github.com/goreliu/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つ必要になる理由はわからなかったです。~~
追記を参照してください。