起動時にスクリプトを実行すると出力がありません(ただし、手動で実行すると出力は正確です)。

起動時にスクリプトを実行すると出力がありません(ただし、手動で実行すると出力は正確です)。

私は最近のレジャー時にいくつかの内容を学ぶために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/sayhiPiに保存して実行可能にします(最も良い答えに従います)。この問題)。 Raspberry Piを再起動するたびに、このスクリプトが実際に実行されていることを確認しました。問題は、スクリプトを手動で実行すると、すべてが正常に動作し、ラップトップ端末にメッセージが表示されることです。ただし、再起動時にスクリプトが自動的に実行されると、メッセージは表示されません。rc.localor にコマンドを入れてもcrontab動作しません。

残念ながら、Pi(または他のコンピュータ)ブートが実際にどのように機能するのかわかりません。それで、このコマンドに必要なサービスが準備されているかどうかわかりません。

だから私の質問は次のようになります

スクリプトが自動的に実行されたときに「オンライン」というメッセージが表示されないのはなぜですか。

また、私のアプローチよりも優れた選択肢があるかもしれません。誰かが正しい方向に私を指すことができればとても感謝します。

よろしくお願いします!

編集する:

  • 鍵認証を使用しているという事実に言及するのを忘れて、スクリプトがPiとして実行されるため、公開RSA鍵をラップトップに追加し、秘密鍵をrootコマンドのIDファイルとして使用しました。authorized_keysssh

  • /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つのオプションがあります。

  1. rootとして実行しssh-keygen、内容をファイル/root/.ssh/id_rsa.pubにコピーします/home/<user>/.ssh/authorized_keys

または

  1. コマンドを次に変更します。/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"

関連情報