私は最近のレジャー時にいくつかの内容を学ぶためにRaspberry Pi 2を購入しました。これで、Raspbianで実行され、Linux Mint 17.2がインストールされているノートブックからSSHを介してリモートで制御できます。
これで、Piが再起動後にノートブックにオンラインであることを自動的に通知し、SSH経由で接続できるようにしたいと思います。私は数秒待つか、Piにpingを送ることができることがわかりましたが、私はラップトップの端末に小さなメッセージが表示されたらいいと思いました。
今までいくつかの修正を経て得たものは次のとおりです(私はこの分野にはあまり慣れていないので、これが真剣に間違ったレベルがどの程度であるかさえわかりません)。
/usr/bin/ssh 'laptop_user'@'laptop_ip' "echo '### RaspberryPi 2 online ###' | /usr/bin/write 'laptop_user' pts/0"
私のラップトップにIP "laptop_ip"があり、 "laptop_user"がログインしている場合pts/0
(多くのifsがありますが、初期のアイデアを実行した後にこれを得ることができるようです)Piの端末で実行すると、これは効果的です)。ノートパソコン端末でも同様
Message from 'laptop_user'@'laptop_host' on pts/0 at 09:58:
### RaspberryPi 2 online ###
EOF
現れる。 (はい!)
その後、コマンドを小さなスクリプトに入れました。
#! /bin/sh
/usr/bin/ssh 'laptop_user'@'laptop_ip' "echo '### RaspberryPi 2 online ###' | /usr/bin/write 'laptop_user' pts/0"
exit 0
/etc/network/if-up.d/sayhi
Piに保存して実行可能にします(最も良い答えに従います)。この問題)。 Raspberry Piを再起動するたびに、このスクリプトが実際に実行されていることを確認しました。問題は、スクリプトを手動で実行すると、すべてが正常に動作し、ラップトップ端末にメッセージが表示されることです。ただし、再起動時にスクリプトが自動的に実行されると、メッセージは表示されません。rc.local
or にコマンドを入れてもcrontab
動作しません。
残念ながら、Pi(または他のコンピュータ)ブートが実際にどのように機能するのかわかりません。それで、このコマンドに必要なサービスが準備されているかどうかわかりません。
だから私の質問は次のようになります
スクリプトが自動的に実行されたときに「オンライン」というメッセージが表示されないのはなぜですか。
また、私のアプローチよりも優れた選択肢があるかもしれません。誰かが正しい方向に私を指すことができればとても感謝します。
よろしくお願いします!
編集する:
鍵認証を使用しているという事実に言及するのを忘れて、スクリプトがPiとして実行されるため、公開RSA鍵をラップトップに追加し、秘密鍵を
root
コマンドのIDファイルとして使用しました。authorized_keys
ssh
/sbin/ip addr
現在起動時にスクリプトを実行すると、次の出力が記録されています。eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000 link/ether b8:27:eb:34:66:ce brd ff:ff:ff:ff:ff:ff
後でスクリプトを実行すると(ssh経由で手動で)、次のように
/sbin/ip addr
なります。eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether b8:27:eb:34:66:ce brd ff:ff:ff:ff:ff:ff inet 192.168.0.105/24 brd 192.168.0.255 scope global eth0 valid_lft forever preferred_lft forever
したがって、問題は、スクリプトを実行するときにPiにローカルIPがないようです
/etc/network/if-up.d
。これで、IPを割り当てた後にスクリプトを実行する必要があります。残念ながら、私はこれを行うネットワーキングについて十分に知りません。
答え1
これは、起動スクリプトがデフォルトでルート環境で実行されるためである可能性が高くなります。~/.ssh/id_rsa.pub
認証モードで使用すると仮定(パスワードを使用すると言及したことがなく、このようなものを自動化するのは一般的に悪い考えなので、鍵認証を想定しています。)。
次に、ラップトップで信頼できるルートキーの生成を許可していないとします。
この場合、2つのオプションがあります。
- rootとして実行し
ssh-keygen
、内容をファイル/root/.ssh/id_rsa.pub
にコピーします/home/<user>/.ssh/authorized_keys
。
または
- コマンドを次に変更します。
/usr/bin/ssh -i /home/<user>/.ssh/id_rsa.pub 'laptop_user'@'laptop_ip' "echo '### RaspberryPi 2 online ###' | /usr/bin/write 'laptop_user' pts/0"
2番目は、すでに有効であることがわかっているユーザー証明書を使用しているため、より簡潔です。
Debian の起動順序とネットワーク接続の問題
(あなたのコメントを読んだ後)これはスクリプトの起動順序の問題である可能性が高いです。これは、betwork network.dで実行されているスクリプトがインターフェイスにDHCPを割り当てて呼び出すことができることを意味します。
rc.local
追いついても申し訳network.target
ないと言うのとは違うnetwork-online.target
。
ここにもいくつかのオプションがあり、そのうちの1つは単に次の行にcrontab
追加することです。
@reboot sleep 60 && /usr/bin/ssh -i /home/<user>/.ssh/id_rsa.pub 'laptop_user'@'laptop_ip' "echo '### RaspberryPi 2 online ###' | /usr/bin/write 'laptop_user' pts/0"
これにより、SSHコマンドを実行する前にコマンドが60秒間スリープモードになります。
世界で最も美しいものではありませんが、一緒に提供されるリアルタイムの「通知」を気にしない限り、迅速かつ効果的です。
より安定したオプションが必要な場合、ネットワークがオンラインになるまで初期化スクリプトを起動しないターゲットinit.d
要件を持つスクリプトを生成することをお勧めします。network-online.target
これは最も高速で信頼性の高いオプションです。
私は使用するので、systemd
正しいinit.d
スクリプトatmを作成または確認することはできません。このガイドに従って操作してください。https://www.debian-administration.org/article/28/Making_scripts_run_at_boot_time_with_Debian
答え2
これを行うssh
には、ターゲットボックスに端末デバイスを作成するように指示する必要があります。これにはフラグをwrite
使用できます。-t
二重。
ssh -tt 'laptop_user'@'laptop_ip' "echo '### RaspberryPi 2 online ###' | /usr/bin/write 'laptop_user' pts/0"