如何运行脚本,具体取决于互联网连接


48

我经常使用sshfs挂载远程驱动器。我很想自动安装此挂载。但是,如果我在.bashrc或启动脚本中挂载它,则挂载通常会失败,因为尚未建立我的无线Internet连接。

有人知道每次建立连接时执行bash脚本或自动安装sshfs驱动器的简单方法吗?

Answers:


56

将您的脚本添加到中/etc/network/if-up.d/。命名您的脚本,不带“ .sh”扩展名。

在添加脚本后还要运行chmod +x /etc/network/if-up.d/yourscriptname以赋予必要的权限。

确保文件中提到了应在打开时触发脚本的网络接口(例如wlan0或eth0)/etc/network/interfaces


12
在脚本内部,/etc/network/*.d/您可以使用变量$IFACE来知道哪个接口正在建立连接,因此,例如,如果是有线连接,则可以跳过该过程。
卡洛斯·坎德罗斯(CarlosCampderrós)

有没有一种方法可以指定要用于哪个特定网络?当它是我的家庭网络时,我想执行脚本,但是当我不在网络上时,我可能不想...
Joshua Robison

3
这实际上似乎根本不起作用。我知道我的脚本可以工作,因为我可以在终端中使用./来运行它们,并且它们可以工作,但是当我关闭和打开连接时,根本不会调用这些脚本。有什么我需要做的以某种方式引用它们吗?在if-up.d中删除脚本似乎缺少一个步骤?!?!
Joshua Robison

1
请检查他们是否具有正确的权限。
dedunumax

2
请添加interfaces不存在的确切内容。它是auto wlan0iface wlan0 inet dhcp要不然某事?
Cookie Cookie 2014年

25

编者注:Cuttlefish自2012年以来未进行更新,并且不在当前的任何Ubuntu存储库中

Ubuntu 12.04

  • Install Cuttlefish:一个简单的工具,通过在触发特定事件时执行动作,在计算机上实现反射。
  • 打开墨鱼,然后单击New

    第1步

    • 给它起一个名字,并将“ 激活刺激激活”选项更改为“开”。
    • 单击“ 刺激”,选择“ 网络 ”类别,然后键入“ 连接到WLAN”。单击确定。

    第2步

    • 您还可以选择无线网络的SSID,并且可以选择是否在启动时进行检查。

    第三步

    • 现在,您必须指定一个反应。转到反应选项卡,然后单击添加。从类别中选择“ 应用程序”,然后从类型中选择“ 启动应用程序(以高级模式)”

    第四步

    • 现在,在可执行选项中指定要运行的脚本。您甚至可以将参数传递给脚本。

    步骤5

    • 就是这样!还要确保在启动应用程序中添加墨鱼。转到编辑>首选项,然后启用自动启动选项。

    步骤6


6
墨鱼被完全弄碎了,一段时间没有更新了。我希望它能得到更多的发展,因为我们需要诸如Linux的Android Tasker应用之类的东西。没有人想弄混etc / network / interfaces和if-up文件夹和脚本。请给我一些我可以单击或打开和关闭的东西。
2014年

2

我将回答OP问题的这一部分:“我希望自动安装此支架”

我最喜欢的自动挂载网络共享工具是autofs:https : //help.ubuntu.com/community/Autofs

AutoFS是我安装NAS的首选工具-适用于所有笔记本电脑和工作站。

autofs是一个用于根据需要自动挂载目录的程序。自动挂载仅在访问它们时挂载,并且在一段时间不活动后才被挂载。因此,自动挂载NFS / Samba共享可以节省带宽并提供更好的性能。与通过fstab进行的静态安装相比,整体性能。


您的答案可能会稍晚一些,因为OP已经接受了另一个答案。您的帮助当然会得到赞赏,但是,将精力集中在未解决的问题
Wayne_Yux

抱歉,韦恩(Wellne),RBell在这里笑到了最后-最佳答案(关于使用墨鱼)已不再适用,因为该软件包已过时-但autofs仍然存在,如果没有此帖子,我还没有看到。谢谢,贝尔!
KlaymenDK

1

最好,最简单,最简便的方法是将up命令添加到您要使用的接口上。

可以在“ / etc / network /”目录下的文件名“ interfaces”下找到接口

iface elan0 inet manual
    up filename.sh

这会将up命令添加到elan0。类似地将其提供给您要使用的任何接口。记住要缩进一个制表符空间。

确保您授予该文件执行权限。

sudo chmod 755 filename.sh

1
太棒了!适用于tun0由管理的VPN接口network-manager。关键是使用inet manual
KrisWebDev

1

就我而言,/etc/network/if-up.d/就像我添加到/etc/network/interfaces以下内容一样,该解决方案对我而言不起作用:

auto wlp58s0
iface wlp58s0 inet dhcp
post-up /home/augustin/Config/myscript.sh

Wifi将在重启后启动。

但经过一番挣扎,从后此链接,什么工作是将脚本添加到/etc/NetworkManager/dispatcher.d/形式90myscript.sh,其中90是脚本并用以下形式的优先级:

#!/bin/bash

IF=$1
STATUS=$2

if [ "$IF" == "wlp58s0" ]
then
    case "$2" in
        up)
        # interface is up
        ;;
        down)
        # interface will be down
        ;;
        pre-up)
        # interface will be up
        ;;
        post-down)
        # interface is down
        ;;
        *)
        ;;
    esac
fi

我猜想谁在系统级别控制网络配置之间存在问题,有时默认network行为留在了调度员之后。

另外,对于那些想要-像我一样-尝试建立指向脚本的符号链接(以便将文件存储在更好的位置)的人,不幸的是,它对我不起作用。

希望这可以帮助!


1

systemd 如今似乎已经接管了网络。

$ networkctl
WARNING: systemd-networkd is not running, output will be incomplete.

IDX LINK             TYPE               OPERATIONAL SETUP
  1 lo               loopback           n/a         unmanaged
  2 enp0s25          ether              n/a         unmanaged
  3 wlo1             wlan               n/a         unmanaged

3 links listed.

它还具有与接口相对应的单元

$ systemctl list-units |grep wlo1
sys-devices-pci0000:00-0000:00:1c.3-0000:24:00.0-net-wlo1.device                                                        loaded active plugged   Centrino Ultimate-N 6300 (3x3 AGN)
sys-subsystem-net-devices-wlo1.device                                                                                   loaded active plugged   Centrino Ultimate-N 6300 (3x3 AGN)

显然,您可以在服务单元文件中使用它们。因此,只需创建一个服务单元来运行您的脚本并使用内部类似的内容使其有条件地在网络上运行:

BindsTo=sys-subsystem-net-devices-wlo1.device
After=sys-subsystem-net-devices-wlo1.device

祝好运!我尚未对此进行测试,因此“您的里程可能会有所不同”。

资料来源:

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.