Перезапуск сети через SSH


11

На сервере A я хочу выдать следующие команды серверу B через ssh.

service network stop
sleep 5
service network start

Проблема заключается в том, что я произвел остановку сети, и мое текущее ssh-соединение также потеряно. Поэтому я не могу выполнить последующие команды (сон 5 и запуск сервисной сети). Обратите внимание, что я не могу использовать (служба перезагрузки сети).

У кого-нибудь есть обходной путь / решение для этого?


5
почему бы вам просто не использовать опцию «перезагрузить»? зачем отдельно останавливаться, а потом начинать?
SpacemanSpiff

Это единственное решение, которое работает с современными версиями Debian и Ubuntu: serverfault.com/a/731120/10361 сервисный подход стал "ошибочным" в обоих дистрибутивах за последние годы.
сорин

Ответы:


8

Если вы делаете это в интерактивном режиме, почему бы не начать screenсеанс? Это будет выглядеть примерно так:

screen

(запускается оболочка scren)

service network restart

(Сеанс SSH отключается, но перезапуск сети продолжается в сеансе экрана)

(Подождите несколько секунд)

(SSH возвращается в хост после завершения перезагрузки)

screen -r

(Подключитесь к экрану и проверьте ошибки)

ИМХО, всегда страшно перезагружать сетевой интерфейс удаленно. Что происходит, когда он не возвращается? У вас есть консоль или другие средства в хосте, если происходит что-то плохое?


1
Я всегда оперирую screenпри работе на удаленных машинах. В случае незапланированных отключений это может спасти жизнь. Также может быть полезно иметь несколько активных оболочек в одном сеансе. Вы также можете посмотреть на это tmux, я не использовал его сам, но некоторые предпочитают, screenи его основная функция обеспечивает те же преимущества.
Дэвид Спиллетт

Устаревший: это больше не работает: Failed to restart network.service: Unit network.service failed to load: No such file or directory.Это работает: serverfault.com/a/731120/10361
Сорин

@sorin Какая платформа? Это предполагало вариант RedHat.
Кори С.

systemctl restart networkingу меня почему-то не работало на tmuxсессии на Ubuntu Xenial. systemctl restart networkработал на CentOS 7 (OpenVZ) даже не в tmux/ screenсессию. Без потери связи.
x-yuri

5

Точные команды, доступные для этого, зависят от дистрибутива Linux. Опция, которая является довольно стандартной, состоит в том, чтобы запланировать и «включить» работу на 5 секунд в будущем, чтобы перезапустить сеть. Другой способ - использовать nohupкоманду.

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

В других дистрибутивах есть команда daemon, чтобы превратить полученную программу в демона, который больше не связан с оболочкой.


2

Очень простой способ сделать это с помощью оператора and:

service network stop && sleep 5 && service network start

2
Я бы предпочел остановку сервисной сети; спать 5; запуск сервисной сети. Если какая-либо из команд потерпит неудачу, она все равно выполнит остальные.
ghm1014

@ ghm1014 Да, это тоже очень хорошая альтернативная форма. На самом деле, это то, что я обычно использую.
Джордан С. Джонс

1
В чем преимущество service network restart?
Калеб

Когда вы делаете, service network stopинтерфейс отключается, bashполучает SIGHUP, и никакие другие команды не выполняются. Я что-то пропустил?
x-yuri

1

Почему бы не поместить его в сценарий оболочки и выполнить через SSH?


Если я помещу это в скрипт, то это произойдет: на сервере A, ssh server_B "execute_script". Но я все еще не потеряю свое соединение SSH от A до B? Я надеюсь, что смогу сохранить соединение ssh ...
Кармен

1
Вы не можете сохранить сеанс SSH, если останавливаете сетевой интерфейс на сервере.
Кристофер Армстронг

таким образом, будет похоже, что моя сессия ssh зависнет, пока я запускаю этот скрипт перезапуска. Есть ли способ подделать это? Например. выйти из текущего сеанса SSH и повторно подключиться к нему?
Кармен

1
Ага, экран, как отметил сегодняшний ответ.
mfinni

Да, это не сработает. «Перезапуск сервисной сети» фактически вызывает сценарий оболочки, но внутри он просто запускается и останавливается, а затем запускается. Сессия ssh отключается после остановки, и запуск никогда не происходит. Экран или nohup это ответ. Обратите внимание, что я сделал это через экран, и он фактически сохранил для меня существующую сессию ssh (только небольшая задержка), но без экрана это не так. ОПАСНОСТЬ УБИТА РОБИНСОНА: это хороший способ полностью потерять доступ к удаленной системе (если вы потеряете соединение, не будете отлаживать, вы просто подпорчены).
Джаред

1

Попробуйте это (возможно, установив cron при необходимости):

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

Затем выйдите из системы, подождите 6 минут и перезапустите


1
atПланировщик не в пакете хрон на большинстве дистрибутивов, попробуйте найти для atупаковки непосредственно.
Калеб

1

Это работает с современными Debian и Ubuntu, тогда как все остальные ответы не будут работать.

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

Пожалуйста, имейте в виду, что возврат интерфейса может занять некоторое время. В моем случае около 15 секунд, поскольку у меня есть связь.


0

Звучит так, будто вы хотите экран или tmux . Это позволит вам сохранить сеанс через потерю сетевого подключения. Они действительно очень полезны, почти все мои терминальные сеансы проходят через экран.


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

например

[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.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.