시작 시 스크립트를 실행할 때 출력이 없습니다(그러나 수동으로 실행하면 출력이 정확함).

시작 시 스크립트를 실행할 때 출력이 없습니다(그러나 수동으로 실행하면 출력이 정확함).

나는 최근 여가 시간에 몇 가지 내용을 배우기 위해 Raspberry Pi 2를 구입했습니다. 이제 Raspbian에서 실행되며 Linux Mint 17.2가 설치된 노트북에서 SSH를 통해 원격으로 제어합니다.

이제 Pi가 재부팅 후 노트북에 온라인 상태임을 자동으로 알려 SSH를 통해 연결할 수 있기를 원합니다. 몇 초 정도 기다리거나 Pi에 핑을 보낼 수 있다는 것은 알지만, 어쩐지 내 노트북의 터미널에 작은 메시지가 나타나면 좋을 것 같다고 생각했습니다.

지금까지 약간의 수정을 거쳐 얻은 것은 다음과 같습니다(저는 이 분야에 매우 익숙하지 않기 때문에 이것이 심각하게 잘못된 수준이 어느 정도인지조차 모릅니다).

/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인증 모드로 사용한다고 가정(비밀번호를 사용한다고 언급한 적이 없으며 이와 같은 것을 자동화하는 것은 일반적으로 나쁜 생각이므로 키 인증을 가정하고 있습니다.).

그런 다음 랩톱에서 신뢰할 수 있는 루트 키 생성을 허용하지 않았다고 가정하겠습니다.

이 경우 두 가지 옵션이 있습니다.

  1. 루트로 실행 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"

두 번째는 이미 유효하다고 알고 있는 사용자 인증서를 사용하기 때문에 더 간결합니다.

데비안 부팅 순서 및 네트워크 연결 문제

(귀하의 의견을 읽은 후) 이는 스크립트 부팅 순서 문제일 가능성이 높습니다. 즉, betwork network.d에서 실행 중인 스크립트가 인터페이스에 DHCP를 할당하고 이를 불러올 수 있다는 의미입니다.

rc.local따라잡아도 미안 network.target하다고 말하는 것과는 다르다 network-online.target.

여기에도 몇 가지 옵션이 있으며 그 중 하나는 간단히 다음을 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"

관련 정보