Nenhuma saída ao executar o script na inicialização (mas a saída correta se for executada manualmente)

1

Eu recentemente comprei um Raspberry Pi 2 para aprender algumas coisas no meu tempo livre. Agora ele está rodando em Raspbian e eu o controle remotamente via ssh de um laptop com o Linux Mint 17.2 instalado.

Agora eu gostaria que o Pi informasse automaticamente ao laptop que ele está on-line após uma reinicialização, para que eu saiba que posso me conectar a ele via ssh. Eu sei que posso apenas esperar alguns segundos ou pingar o Pi, mas de alguma forma eu coloquei na minha cabeça que seria legal se uma pequena mensagem aparecesse no meu terminal no laptop.

O que eu tenho até agora depois de alguns ajustes é o seguinte (eu sou muito novo para isso, então eu nem tenho consciência dos níveis em que isso pode estar terrivelmente errado):

/usr/bin/ssh 'laptop_user'@'laptop_ip' "echo '### RaspberryPi 2 online ###' | /usr/bin/write 'laptop_user' pts/0"

Isso funciona quando executado em um terminal no Pi se meu laptop tiver o IP 'laptop_ip' e se 'laptop_user' estiver logado em pts/0 (muitos ifs, mas eu imaginei que chegaria àqueles depois que eu conseguisse a ideia inicial em funcionamento). No terminal do laptop, algo como

Message from 'laptop_user'@'laptop_host' on pts/0 at 09:58:
### RaspberryPi 2 online ###
EOF

aparece. (yeah!)

Em seguida, coloco o comando em um pequeno script:

#! /bin/sh
/usr/bin/ssh 'laptop_user'@'laptop_ip' "echo '### RaspberryPi 2 online ###' | /usr/bin/write 'laptop_user' pts/0"
exit 0

salvou-o como /etc/network/if-up.d/sayhi no Pi e tornou-o executável (seguindo a melhor resposta em esta questão ). Eu verifiquei que este script realmente é executado após cada reinicialização do Pi. A coisa é, se eu executar o script manualmente tudo funciona bem e eu recebo a mensagem no meu terminal de laptop. Mas se o script for executado automaticamente na reinicialização, não recebo a mensagem. Colocar o comando em rc.local ou crontab também não funcionou.

Eu infelizmente não tenho conhecimento de como uma startup do Pi (ou de qualquer computador) funciona. Então eu não sei se os serviços necessários para este comando já estão prontos.

Então, minha pergunta é:

Por que não recebo a mensagem "on-line" quando o script é executado automaticamente e quando devo executar meu pequeno roteiro para obter o comportamento desejado?

Além disso, pode haver alternativas muito melhores à minha maneira de fazer isso. Então, se alguém pudesse me apontar na direção certa, agradeceria.

Obrigado antecipadamente!

edit:

  • Esqueci de mencionar que estou usando autenticação de chave e como o script será executado como o root do Pi Adicionei sua chave RSA pública a authorized_keys no laptop e estou usando a chave privada key como o arquivo de identificação para o comando ssh .

  • Estou agora registrando a saída de /sbin/ip addr durante a execução do script na inicialização e se isso me der:

    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

    Ao executar o script mais tarde (manualmente por ssh) /sbin/ip addr me dá:

    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

    Portanto, o problema parece ser que o Pi não possui um IP local enquanto executa os scripts em /etc/network/if-up.d . Agora tenho que executar meu script depois que o IP é atribuído. Infelizmente, não sei o suficiente sobre redes para poder fazê-lo.

por nieswand 06.01.2016 / 11:26

2 respostas

1

O mais provável é que o script de inicialização seja executado em um ambiente raiz por padrão. Assumindo que você está usando ~/.ssh/id_rsa.pub como seu modo de autenticação (Você nunca mencionou que está usando uma senha e usando tal coisa, enquanto automatizar é uma má idéia de qualquer forma, então eu assumirei a autenticação por chave) .

Então, vou em frente e presumo ainda mais que você não permitiu que a (ou tenha uma) raiz-chave gerada fosse confiável em seu laptop?

Você tem duas opções neste caso.

  1. execute ssh-keygen como root e copie o conteúdo de /root/.ssh/id_rsa.pub para seu arquivo /home/<user>/.ssh/authorized_keys .

ou

  1. altere seu comando para /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"

O segundo é mais simples, pois usa o certificado de usuário que você já conhece.

pedido de inicialização da Debian e problema de conectividade de rede

Provavelmente (depois de ler seus comentários) este é um problema de ordem de inicialização de script, o que significa que seu script é executado. betwork network.d teve uma chance de DHCP sua interface e trazê-lo para cima.

mesmo rc.local é executado depois de network.target , mas isso não é o mesmo que network-online.target desculpe dizer.

Você tem novamente algumas opções aqui, uma é simplesmente adicionar isso à sua linha 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"

Qual vai adiar seu comando por 60 segundos antes de executar o comando SSH.
Não é a coisa mais bonita do mundo, mas se você não se importa com as "notificações" em tempo real, é rápido e funciona.

Se você quiser opções mais confiáveis, , sugiro que crie um script init.d com um requisito de destino para network-online.target , que não acionará seu script de inicialização até que a rede seja conectados. Esta é a opção mais rápida e confiável para seguir.

Eu uso systemd , portanto não posso escrever ou verificar um script init.d adequado, tente seguir este guia e veja se funciona: link

    
por 06.01.2016 / 16:33
0

Você precisa informar ssh para criar um dispositivo de terminal na caixa de destino, para que write funcione. Você faz isso com o sinalizador -t . Duas vezes.

ssh -tt 'laptop_user'@'laptop_ip' "echo '### RaspberryPi 2 online ###' | /usr/bin/write 'laptop_user' pts/0"
    
por 07.01.2016 / 14:09