相关疑难解决方法(0)

在 bash 脚本中等待网络

我正在运行一个依赖于网络启动和网络共享安装的脚本。该脚本在登录时运行(启动后自动发生)。问题是在脚本运行时,我通常还没有 IP 地址 (DHCP)。目前我只是让脚本休眠 15 秒,但我根本不喜欢这种方法,因为我希望能够告诉用户是否有问题。

我的计划是,当我还没有 IP 地址时循环并在我有时继续。至关重要的是,它必须在一段时间后超时。我想出的是,if [ ifconfig | grep "192.168.100" ];但结果是 grepconsumes];并且不喜欢它。然后 bash 也会感到不安,因为它找不到];哪个 grep 吃了。然后我什至还没有实现超时。

有人建议保留一个变量,并在每次迭代中休眠一秒,每次都增加这个变量。这是我的完整(非工作)脚本(我对 bash 脚本还很陌生):

x=0
while [ ifconfig | grep "192.168.100." > /dev/null ]; do
    echo "no nework"
    if "$x" -gt 200; then
        #Time out here
        exit 1
    x=$((x+1))
    sleep .1
    fi
done

#continue with rest of script...
Run Code Online (Sandbox Code Playgroud)

任何指向正确方向的指针将不胜感激!

networking shell-script test

10
推荐指数
1
解决办法
3万
查看次数

为什么我的 systemd 服务不等待网络?

根据问题及其答案,我已将以下内容添加到我的服务文件中:

Wants=network-online.target
After=docker.service network.target network-online.target
Run Code Online (Sandbox Code Playgroud)

我也跑了:

systemctl enable NetworkManager-wait-online.service
systemd-networkd-wait-online.service
Run Code Online (Sandbox Code Playgroud)

然而ExecStartPregit pull origin master由于似乎是连接问题,我使用的任务仍然失败。

Mar 22 16:17:21 COMPUTER git[1983]: ssh: Could not resolve hostname github.com: Name or service not known
Mar 22 16:17:21 COMPUTER git[1983]: fatal: Could not read from remote repository.
Run Code Online (Sandbox Code Playgroud)

我错过了一些明显的东西吗?我是否需要等待其他服务才能使用git pull?(如果相关,我使用的是 Ubuntu 16.10 和 systemd 231。)

networking systemd

10
推荐指数
1
解决办法
1万
查看次数

Systemd-networkd:DHCP 客户端获取新地址后运行脚本

我在 ubuntu 18.04 服务器上。我需要运行一个更新 CloudFlare 上的 IP 地址的脚本(一种 DynDNS 脚本)。在以前的版本中,我可以使用接口 enp1s0 的 DHCLIENT 退出挂钩来执行此操作。

\n\n

但是,systemd 现在使用自己的内置 DHCP 客户端。如何编写一个 systemd 单元,在向 DCHP 客户端提供新 IP 地址后立即执行 bash 脚本?

\n\n

Systemd 正在管理接口 enp1s0:

\n\n
#sudo  systemctl status systemd-networkd\n\xe2\x97\x8f systemd-networkd.service - Network Service\n   Loaded: loaded (/lib/systemd/system/systemd-networkd.service; enabled-runtime; vendor preset: enabled)\n   Active: active (running) since Tue 2018-09-18 01:54:16 +08; 10h ago\n     Docs: man:systemd-networkd.service(8)\n Main PID: 878 (systemd-network)\n   Status: "Processing requests..."\n    Tasks: 1 (limit: 4915)\n   CGroup: /system.slice/systemd-networkd.service\n           \xe2\x94\x94\xe2\x94\x80878 /lib/systemd/systemd-networkd\n\nSep 18 01:54:27 xxx systemd-networkd[878]: enp1s0: Configured\n …
Run Code Online (Sandbox Code Playgroud)

ubuntu dhcp systemd dyndns systemd-networkd

8
推荐指数
1
解决办法
2万
查看次数

Echo 权限被拒绝(尝试在 shell 脚本中使用 echo 而不是 ls 命令)

我正在尝试编写一个脚本,在某些时候我需要列出目录中的所有内容并从该目录中 grep 一些内容。我用ls做不到。ls 不是我该做的人。所以我尝试用 echo 命令来完成 ls 的工作,但它现在给了我一个权限被拒绝的错误。您可以看到下面的脚本:

#!/bin/sh
# Test for network connection

for interface in $(echo $(/sys/class/net/*) | grep -v lo);
do
  if [ "$(cat /sys/class/net/"$interface"/carrier)" = 1 ]; then
 OnLine=1;
 fi
done
if ! [ $OnLine ]; then echo "Not Online" > /dev/stderr;
 exit;
fi
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

./carriercontrol.sh: line 10: /sys/class/net/apcli0: Permission denied
Run Code Online (Sandbox Code Playgroud)

我可以做什么来完成这个脚本?有没有办法获取目录列表并用某些东西通过管道传输它。而且即使我可以取消该许可,我认为 echo 也会给我带来更多麻烦。

编辑: 我尝试用 find 命令替换 echo ,这是结果和错误。

#!/bin/sh


# Test for network conection
for interface in $(find /sys/class/net -mindepth 1 | grep -v …
Run Code Online (Sandbox Code Playgroud)

linux shell-script echo openwrt ash

1
推荐指数
1
解决办法
1983
查看次数