Reiniciando a rede através do SSH

11

No servidor A, desejo emitir os seguintes comandos para o servidor B por meio do ssh.

service network stop
sleep 5
service network start

O problema é que eu emiti uma parada de rede, então minha conexão ssh atual também é perdida. Portanto, não consigo executar os comandos seguintes (suspensão 5 e início da rede de serviço). Observe que não posso usar (reiniciar a rede de serviço).

Alguém tem uma solução / solução alternativa para isso?

Carmen
fonte
5
por que você não usaria a opção "restart"? por que parar separadamente e começar?
precisa
Esta é a única solução que funciona com as versões modernas do Debian e Ubuntu: serverfault.com/a/731120/10361, a abordagem de serviço tornou-se "defeituosa" em ambas as distros nos últimos anos.
sorin

Respostas:

8

Se você estiver fazendo isso de maneira interativa, por que não iniciar uma screensessão? Seria algo como isto:

screen

(o shell scren começa)

service network restart

(A sessão SSH é desconectada, mas a reinicialização da rede continua na sessão da tela)

(Aguarde alguns segundos)

(SSH de volta ao host quando a reinicialização terminar)

screen -r

(Reconecte-se à tela e verifique se há erros)

IMHO, é sempre assustador reiniciar uma interface de rede remotamente. O que acontece quando ele não volta? Você tem um console ou outros meios para o host se algo ruim acontecer?

Corey S.
fonte
1
Eu sempre opero screendurante o trabalho em máquinas remotas. No caso de desconexões não planejadas, pode salvar a vida. Também ter vários shells ativos na mesma sessão pode ser útil. Você também pode gostar de ver tmux, eu não o usei, mas alguns preferem screene sua função principal oferece os mesmos benefícios.
precisa
Desatualizado: isso não funciona mais: Failed to restart network.service: Unit network.service failed to load: No such file or directory.Funciona: serverfault.com/a/731120/10361 #
sorin
@sorin Qual plataforma? Isso estava assumindo uma variante RedHat.
Corey
systemctl restart networkingnão funcionou para mim por algum motivo na tmuxsessão no Ubuntu Xenial. systemctl restart networktrabalhou no CentOS 7 (OpenVZ) nem em tmux/ screensessão. Sem perder a conexão.
X-yuri
5

Os comandos exatos disponíveis para isso variam com base na distribuição do Linux. Na opção que é bastante padrão é agendar e "at" o trabalho por 5 segundos no futuro para reiniciar a rede. Outro é usar o nohupcomando

echo "sleep 5; /etc/init.d/networking start" | at now
nohup sh -c 'sleep 5; /etc/init.d/networking start' &

Outras distribuições têm o comando daemon para transformar o programa resultante em um daemon que não está mais associado ao shell.

Seth Robertson
fonte
2

Uma maneira muito simples de fazer isso é usando o operador e:

service network stop && sleep 5 && service network start
Jordan S. Jones
fonte
2
Eu preferiria parar a rede de serviço; dormir 5; início da rede de serviço. Se algum dos comandos falhar, o restante será executado de qualquer maneira.
ghm1014
@ ghm1014 Sim, essa também é uma forma alternativa muito boa. De fato, é isso que eu normalmente uso.
Jordan S. Jones
1
Qual é a vantagem service network restart?
Caleb
Quando você faz, service network stopa interface fica inativa, bashrecebe SIGHUPe nenhum outro comando é executado. Estou esquecendo de algo?
X-yuri
1

Por que não colocá-lo em um script de shell e executá-lo via SSH?

Christopher Armstrong
fonte
Se eu colocá-lo em um script, isso acontecerá: no servidor A, ssh server_B "execute_script". Mas ainda não perderei minha conexão ssh de A para B? Estou esperando que eu ainda pode preservar a conexão ssh ...
Carmen
1
Você não pode preservar a sessão SSH se estiver parando a interface de rede em um servidor.
Christopher Armstrong
portanto, parece que minha sessão ssh será interrompida enquanto estou executando esse script de reinicialização. Existe uma maneira de fingir isso? Por exemplo. sair da sessão atual do ssh e reconectar-se a ela?
Carmen
1
Sim, tela, conforme observado pela resposta de hoje.
mfinni
Sim, isso não vai funcionar. A "reinicialização da rede de serviço" na verdade chama um script de shell, mas internamente apenas executa a parada e a inicialização. A sessão ssh é interrompida após a parada e o início nunca acontece. Tela ou nohup é a resposta. Note, eu fiz isso através da tela e ela realmente preservou a sessão ssh existente para mim (apenas um pouco de atraso), mas não ficará sem tela. O PERIGO VAI ROBINSON: esta é uma boa maneira de perder totalmente o acesso ao sistema remoto (se você perder a conexão, sem depurar, estará apenas na mangueira).
Jared
1

Tente isso (talvez seja necessário instalar o cron, se necessário):

$ at now+5min
at> service network stop
at> sleep 5
at> service network start
at> [control-D]

Então saia, espere 6 min e volte a entrar

RainerFromReading
fonte
1
O atagendador não está no pacote cron na maioria das distribuições; tente procurar atdiretamente um pacote.
Caleb
1

Isso funciona com o Debian e Ubuntu modernos, enquanto todas as outras respostas não funcionam.

screen
sudo ifdown --exclude=lo -a && sudo ifup --exclude=lo -a

Lembre-se de que pode demorar um pouco para recuperar a interface. No meu caso, cerca de 15 segundos, pois tenho um vínculo.

sorin
fonte
0

Parece que você quer tela ou tmux . Isso permitirá que você preserve sua sessão com a perda de uma conexão de rede. Eles são realmente bastante úteis, quase todas as minhas sessões de terminal são através da tela.

Jeff Tang
fonte
0
#!/bin/sh

# CentOS Linux release 7.4.1708 (Core) 

# 1. restart the network service
# 2. take the NIC [ens32] down
# 3. bring the NIC [ens32] up

systemctl restart network \
  && ifdown ens32 \
  && ifup ens32
#!/bin/sh

# Linux far-seer-01 4.9.0-8-amd64 #1 SMP Debian 4.9.144-3.1 (2019-02-19) x86_64 GNU/Linux

/etc/init.d/networking restart \
    && ifdown eth0 \
    && ifup eth0

por exemplo

[root@localhost tmp]# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:b3:74:da brd ff:ff:ff:ff:ff:ff
    inet 192.168.224.129/24 brd 192.168.224.255 scope global dynamic ens32
       valid_lft 1796sec preferred_lft 1796sec
    inet6 fe80::f06e:8b57:23fc:b25/64 scope link 
       valid_lft forever preferred_lft forever
[root@localhost tmp]# cat /etc/redhat-release 
CentOS Linux release 7.4.1708 (Core) 
[root@localhost tmp]# cat net.sh 
#!/bin/sh

# 1. restart the network service
# 2. take the NIC [ens32] down
# 3. bring the NIC [ens32] up

systemctl restart network \
  && ifdown ens32 \
  && ifup ens32
[root@localhost tmp]# sh net.sh 
Device 'ens32' successfully disconnected.
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/17)
$ cat /etc/os-release 
PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
NAME="Debian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
$ cat net.sh 
#!/bin/sh

# Linux far-seer-01 4.9.0-8-amd64 #1 SMP Debian 4.9.144-3.1 (2019-02-19) x86_64 GNU/Linux

/etc/init.d/networking restart \
    &&ifdown eth0 \
    && ifup eth0
$ sh net.sh 
[ ok ] Restarting networking (via systemctl): networking.service.
ifdown: interface eth0 not configured
Internet Systems Consortium DHCP Client 4.3.5
Copyright 2004-2016 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/

Listening on LPF/eth0/00:0c:29:8a:67:72
Sending on   LPF/eth0/00:0c:29:8a:67:72
Sending on   Socket/fallback
DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 5
DHCPREQUEST of 192.168.224.128 on eth0 to 255.255.255.255 port 67
DHCPOFFER of 192.168.224.128 from 192.168.224.254
DHCPACK of 192.168.224.128 from 192.168.224.254
bound to 192.168.224.128 -- renewal in 847 seconds.
ROY
fonte