Khởi động lại mạng thông qua SSH


11

Trên máy chủ A, tôi muốn đưa ra các lệnh sau cho Máy chủ B thông qua ssh.

service network stop
sleep 5
service network start

Vấn đề là do tôi đã phát hành một mạng 'dừng', sau đó kết nối ssh hiện tại của tôi cũng bị mất. Do đó, tôi không thể thực thi các lệnh tiếp theo (ngủ 5 và bắt đầu mạng dịch vụ). Lưu ý rằng tôi không thể sử dụng (khởi động lại mạng dịch vụ).

Có ai có một cách giải quyết / giải pháp cho việc này không?


5
Tại sao bạn không sử dụng tùy chọn "khởi động lại"? Tại sao riêng biệt dừng lại, và sau đó bắt đầu?
SpacemanSpiff

Đây là giải pháp duy nhất hoạt động với các phiên bản Debian và Ubuntu hiện đại: serverfault.com/a/731120/10361 cách tiếp cận dịch vụ trở nên "bị lỗi" trong cả hai bản phát hành trong những năm qua.
sorin

Câu trả lời:


8

Nếu bạn đang làm điều này một cách tương tác, tại sao không bắt đầu một screenphiên? Nó sẽ trông giống như thế này:

screen

(vỏ sò bắt đầu)

service network restart

(Phiên SSH bị ngắt kết nối, nhưng khởi động lại mạng tiếp tục trong phiên màn hình)

(Đợi vài giây)

(SSH trở lại máy chủ khi quá trình khởi động lại kết thúc)

screen -r

(Kết nối lại với màn hình và kiểm tra lỗi)

IMHO, thật đáng sợ khi khởi động lại giao diện mạng từ xa. Điều gì xảy ra khi nó không quay trở lại? Bạn có một bàn điều khiển hoặc phương tiện khác vào máy chủ nếu có điều gì xấu xảy ra?


1
Tôi luôn luôn hoạt động thông qua screenkhi làm việc trên các máy từ xa. Trong trường hợp ngắt kết nối không có kế hoạch, nó có thể là một cứu hộ. Ngoài ra có một số shell hoạt động trong cùng một phiên có thể có ích. Bạn cũng có thể muốn xem xét tmux, tôi đã không sử dụng bản thân mình nhưng một số người thích nó screenvà chức năng cốt lõi của nó cung cấp các lợi ích tương tự.
David Spillett

Đã lỗi thời: điều này không còn hoạt động nữa: Failed to restart network.service: Unit network.service failed to load: No such file or directory.Điều này hoạt động: serverfault.com/a/731120/10361
sorin

@sorin Nền tảng nào? Đây là giả định một biến thể RedHat.
Corey S.

systemctl restart networkingkhông làm việc cho tôi vì một số lý do trong tmuxphiên trên Ubuntu Xenial. systemctl restart networkđã làm việc trên CentOS 7 (OpenVZ) thậm chí không trong tmux/ screenphiên. Mà không mất kết nối.
x-yuri

5

Các lệnh chính xác có sẵn để thực hiện việc này khác nhau dựa trên phân phối Linux. Tùy chọn khá chuẩn là lên lịch và "tại" công việc trong 5 giây trong tương lai để khởi động lại mạng. Một số khác là sử dụng nohuplệnh.

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

Các bản phân phối khác có lệnh daemon để biến chương trình kết quả thành một daemon không còn được liên kết với shell.


2

Một cách rất đơn giản để làm điều này là sử dụng toán tử và:

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

2
Tôi muốn dừng dịch vụ mạng; ngủ 5; mạng lưới dịch vụ bắt đầu. Nếu bất kỳ lệnh nào thất bại, nó sẽ thực hiện phần còn lại.
ghm1014

@ ghm1014 Aye, đó cũng là một hình thức thay thế rất tốt. Trong thực tế, đó là những gì tôi thường sử dụng.
Jordan S. Jones

1
Lợi thế hơn là service network restartgì?
Caleb

Khi bạn thực hiện service network stopgiao diện bị tắt, bashnhận SIGHUPvà không có lệnh nào khác được thực thi. Tui bỏ lỡ điều gì vậy?
x-yuri

1

Tại sao không đặt nó vào một tập lệnh shell và thực thi điều đó thông qua SSH?


Nếu tôi đặt nó trong một tập lệnh, thì điều này sẽ xảy ra: trên Máy chủ A, ssh server_B "exec_script". Nhưng tôi vẫn không mất kết nối ssh từ A đến B chứ? Tôi hy vọng rằng tôi vẫn có thể duy trì kết nối ssh ...
Carmen

1
Bạn không thể duy trì phiên SSH nếu bạn dừng giao diện mạng trên máy chủ.
Christopher Armstrong

vì vậy, có vẻ như phiên ssh của tôi sẽ bị treo trong khi tôi đang chạy tập lệnh khởi động lại đó. Có cách nào để giả mạo điều này? Ví dụ. thoát ra khỏi phiên ssh hiện tại và kết nối lại với nó?
Carmen

1
Vâng, màn hình, như được lưu ý bởi câu trả lời ngày hôm nay.
mfinni

Vâng, điều đó sẽ không làm việc. "Khởi động lại mạng dịch vụ" thực sự gọi một tập lệnh shell, nhưng bên trong nó chỉ chạy dừng rồi bắt đầu. Phiên ssh bị cắt sau khi dừng và bắt đầu không bao giờ xảy ra. Màn hình hoặc nohup là câu trả lời. Lưu ý, tôi đã thực hiện điều này thông qua màn hình và nó thực sự bảo tồn phiên ssh hiện tại cho tôi (chỉ một chút độ trễ), nhưng nó sẽ không có màn hình. NGUY HIỂM SILL ROBINSON: đây là một cách tốt để mất hoàn toàn quyền truy cập vào hệ thống từ xa (nếu bạn mất kết nối, không gỡ lỗi, bạn chỉ bị hos).
Jared

1

Hãy thử điều này (có thể cài đặt cron nếu cần):

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

Sau đó đăng xuất, đợi 6 phút và đăng nhập lại


1
Bộ lập atlịch không có trong gói cron trên hầu hết các bản phát hành, hãy thử tìm kiếm một atgói trực tiếp.
Caleb

1

Điều này hoạt động với Debian và Ubuntu hiện đại, trong khi tất cả các câu trả lời khác sẽ không hoạt động.

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

Xin lưu ý rằng có thể mất một chút để lấy lại giao diện. Trong trường hợp của tôi khoảng ~ 15 giây vì tôi có một trái phiếu.


0

Có vẻ như bạn muốn màn hình hoặc tmux . Những thứ này sẽ cho phép bạn duy trì phiên của mình thông qua việc mất kết nối mạng. Chúng thực sự khá hữu ích, hầu như tất cả các phiên cuối của tôi đều thông qua màn hình.


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

ví dụ

[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.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.