【问题标题】:Linux : NetworkManager's /etc/NetworkManager/dispatcher.d/ test script does not work. code included [closed]Linux:NetworkManager 的 /etc/NetworkManager/dispatcher.d/ 测试脚本不起作用。包含代码[关闭]
【发布时间】:2024-04-23 17:55:01
【问题描述】:

根据信息,里面的任何文件

/etc/NetworkManager/dispatcher.d/

假设从

接收两个可能的命令
NetworkManager

要找出这些命令可能是什么,我们只需
查看其中一个脚本的来源

/etc/NetworkManager/dispatcher.d/

那么让我们这样做吧。

cd     /etc/NetworkManager/dispatcher.d/
ls
00-netreport  05-netfs  10-dhclient
vi 00*

这里什么都没有。

gedit 05*

很好。

#!/bin/sh

export LC_ALL=C

if [ "$2" = "down" ]; then
    /sbin/ip route ls | grep -q ^default || {
        [ -f /var/lock/subsys/netfs ] && /etc/rc.d/init.d/netfs stop || :
    } && { :; }
fi

if [ "$2" = "up" ]; then
    /sbin/ip -o route show dev "$1" | grep -q '^default' && {
        /sbin/chkconfig netfs && /etc/rc.d/init.d/netfs start || :
    } || { :; }
fi

让我们复制它并创建一个名为

的文件
 test

让我们只使用我们需要的“up”。

file: test


#!/bin/sh

export LC_ALL=C

if [ "$2" = "up" ]; then
    /sbin/ip -o route show dev "$1" | grep -q '^default' && {
        /sbin/chkconfig netfs && /etc/rc.d/init.d/netfs start || :
    } || { :; }
fi

让我们对其进行修改,以便它可以“可视化”执行一些我们可以对其进行测试的东西。

#!/bin/sh

export LC_ALL=C

if [ "$2" = "up" ]; then
    gedit test.txt
fi

结果:

Not Working.

让我们以某种方式对其进行修改,以便它可以理解。

#!/bin/sh

export LC_ALL=C

if [ "$2" = "up" ]; then
    /sbin/ip -o route show dev "$1" | grep -q '^default' && {
        gedit test.txt || :
    } || { :; }
fi

正在重新启动..

结果:

nothing

已解决:

这是所选答案中可能的最小代码:
(我能够创建)

case "$2" in
    up)
touch /root/Desktop/ooo
    ;;
esac

我需要让它更小,因为我经常重新格式化我的机器,然后运行一个脚本来自动设置这些东西。所以以后我只会跑

cat >> /etc/NetworkManager/dispatcher.d/test << EOF
case "\$2" in
    up)
touch /root/Desktop/ooo
    ;;
esac
EOF
chmod +x /etc/NetworkManager/dispatcher.d/test

换句话说,$ 必须用“cat&gt;&gt;”转义。

【问题讨论】:

  • 您可以尝试使用更安全的命令来测试它吗?例如:cd ~/Desktop &amp;&amp; touch 'I AM HERE.txt'
  • (不是gedit test.txt,我的意思是。我不确定您是否可以简单地运行它并期望弹出一个带有gedit的新终端)
  • 我认为我需要的是gnome-terminal -e "gedit test.txt",但我无法让它与“-hold”和“sleep”添加一起工作。
  • 是的,您可能是对的,但是您能否让dispatcher.d 脚本运行任何东西,就像我上面给出的简单的桌面上创建文件示例一样?从上面的代码中,很难判断到底是什么失败了。在 NetworkManager 启动时获得一些简单的运行,然后在此基础上进行构建。
  • 我实际上不能,我有点混淆了问题等等,发生的事情是我可以让“gnome-terminal -e "gedit test.txt"”在/etc/rc.d/rc.local内部工作,但不能暂停 8 秒。就这个问题而言,不,我无法在/etc/NetworkManager/dispatcher.d/内执行任何操作@

标签: linux centos startup rc


【解决方案1】:

这是一个在 NetworkManager 连接时运行的脚本的工作示例:

#!/bin/sh -e
# Script to dispatch NetworkManager events
#
# Runs ifupdown scripts when NetworkManager fiddles with interfaces.
# See NetworkManager(8) for further documentation of the dispatcher events.

if [ -z "$1" ]; then
    echo "$0: called with no interface" 1>&2
    exit 1;
fi

# Run the right scripts
case "$2" in
    up|vpn-up)
    logger -s "HELLO THIS IS YOUR SCRIPT"
    cd /home && touch "HELLOFILE.txt"
    ;;
    down|vpn-down)
    ;;
    hostname|dhcp4-change|dhcp6-change)
    # Do nothing
    ;;
    *)
    echo "$0: called with unknown action \`$2'" 1>&2
    exit 1
    ;;
esac

将脚本命名为您喜欢的任何名称,使其可执行,然后将其放入/etc/NetworkManager/dispatcher.d/ 目录。

您可以通过打开终端并运行来验证这是否有效:

sudo tail -f /var/log/syslog //打印系统日志直到取消

然后打开另一个终端,运行:

sudo service network-manager restart //重启网络管理器

您应该会在日志中看到“HELLO THIS IS YOUR SCRIPT”字样以及许多其他信息。并且该文件应该被添加到/home 目录中。

我不确定为什么您打开 gedit 的具体情况不起作用,但这是在网络管理器启动时运行脚本的方式。我的猜测是,问题的其余部分与脚本以 root 身份运行但您希望 gedit 在特定用户(您)的桌面环境中打开的事实有关。祝你好运!

【讨论】:

  • 工作得很好,用更少的行对其进行了测试,并用尽可能少的行更新了这个问题,以简化自动化目的。 case "$2" in up) touch /root/Desktop/ooo ;; esac
  • 它对我来说效果很好(Fedora 5.9.11-200.fc33.x86_64),谢谢各位,我正在尝试使用 crontab(@reboot)和 systemd 服务,但将脚本设置为/etc/NetworkManager/dispatcher.d/ 更好。
最近更新 更多