【问题标题】:Bash Script - Crontab completing part of the bash script but not allBash 脚本 - Crontab 完成了部分 bash 脚本,但不是全部
【发布时间】:2017-02-27 02:45:35
【问题描述】:

下面的 bash 脚本在 L1 上每 10 分钟运行一次,并且在脚本内生成一个随机密码,然后将其打印到一个文件中,然后将其复制到 L2。

#!/bin/bash
targetFile="testfilegen2.log"
address="192.168.1.1"
netmask="255.255.255.0"
channel="1"
essid="GreRPi"
random=$(pwgen 13 -1)
        sudo echo "source-directory /etc/network/interfaces.d" > "$targetFile"
        sudo echo "auto lo" >> "$targetFile"
        sudo echo "auto wlan0" >> "$targetFile"
        sudo echo "allow-hotplug wlan0" >> "$targetFile"
        sudo echo "iface wlan0 inet static" >> "$targetFile"
        sudo echo "address $address" >> "$targetFile"
        sudo echo "netmask $netmask" >> "$targetFile"
        sudo echo "wireless-channel $channel" >> "$targetFile"
        sudo echo "wireless-essid $essid" >> "$targetFile"
        sudo echo "wireless-mode ad-hoc" >> "$targetFile"
        sudo echo "wireless-key s:$random" >> "$targetFile"
        sleep 1
        scp "$targetFile" pi@192.168.1.1:~/.ssh/
        sudo service networking restart

Unfornaltey L1 似乎没有收到新密码,但 L2 收到了。

L1 输出

pi@raspberrypi:/etc/greenwich $ cat testfilegen2.log
source-directory /etc/network/interfaces.d
auto lo
auto wlan0
allow-hotplug wlan0
iface wlan0 inet static
address 192.168.1.1
netmask 255.255.255.0
wireless-channel 1
wireless-essid GreRPi
wireless-mode ad-hoc
wireless-key s:she5Bie1ojoon

L2 输出

pi@raspberrypi:~/.ssh $ cat testfilegen2.log
source-directory /etc/network/interfaces.d
auto lo
auto wlan0
allow-hotplug wlan0
iface wlan0 inet static
address 192.168.1.1
netmask 255.255.255.0
wireless-channel 1
wireless-essid GreRPi
wireless-mode ad-hoc
wireless-key s:ez2eeCeich0oc

有什么建议吗?

谢谢

【问题讨论】:

  • 你检查了脚本的日志,是不是说“权限被拒绝”?

标签: linux bash shell cron


【解决方案1】:

正如 Vikas Tiwari 所指出的,重定向发生在当前用户 之前 sudo 运行时。您需要使用sudo 打开文件。这可以通过tee 程序来完成,您只需运行一次

targetFile="testfilegen2.log"
address="192.168.1.1"
netmask="255.255.255.0"
channel="1"
essid="GreRPi"
random=$(pwgen 13 -1)
{
    echo "source-directory /etc/network/interfaces.d"
    echo "auto lo"
    echo "auto wlan0"
    echo "allow-hotplug wlan0"
    echo "iface wlan0 inet static"
    echo "address $address"
    echo "netmask $netmask"
    echo "wireless-channel $channel"
    echo "wireless-essid $essid"
    echo "wireless-mode ad-hoc"
    echo "wireless-key s:$random"
} | sudo tee "$targetFile" > /dev/null
    sleep 1
    scp "$targetFile" pi@192.168.1.1:~/.ssh/
    sudo service networking restart

【讨论】:

  • 谢谢,但不幸的是它仍然在做同样的事情。
【解决方案2】:

假设您以非 root 用户身份运行脚本,重定向不适用于 sudo,因此请尝试以下操作

sudo sh -c "echo source-directory /etc/network/interfaces.d > $targetFile"

对于双重重定向也是如此。

将脚本的输出和错误重定向到日志文件,这样您就知道出了什么问题。为此,请进行以下更改:

    #!/bin/bash
    {
    ...
    your script here
    ...
    } 2>&1 > /tmp/myScript.log

您可以进一步在调试模式下运行脚本,逐步调试您的脚本。

如果你对同一个文件进行一次又一次的SCPing,我建议你在远程机器上检查文件的修改时间,以确认文件是否收到了更新。

【讨论】:

  • 谢谢你,但不幸的是它仍然在做同样的事情
  • 它没有出现错误,它只是不更新​​ L1 上的 testfilegen2.log,而只更新 L2 上的 testfilegen2.log。我对这个有点困惑。
  • 目标文件实际上是在 L1 上创建的,并且被 SCPed 到 L2,对吗?您是否还尝试检查日志,因为脚本可能会运行但它应该会抛出错误,因为您使用 sudo 重定向它。
  • 使用 cron 日志,每次运行 bash 脚本时都会出现两行:'Feb 26 17:20:02 raspberrypi CRON[4595]: (pi) CMD (/etc/greenwich/ gentest.sh) 2 月 26 日 17:20:12 raspberrypi CRON[4591]: (CRON) 信息(未安装 MTA,丢弃输出)'
  • Right "NO MTA installed, discarding output" 表示您的脚本正在生成输出,但是由于您没有安装邮件程序,因此无法将输出邮件发送给您。阅读此链接askubuntu.com/questions/222512/…
【解决方案3】:

考虑到您的文件是在目标上复制的,这意味着它是在源上创建的。这里毫无疑问。 似乎“$targetfile”是在您不希望它位于的目录中创建的。如果未指定目标的完整路径,则典型问题。 您的脚本位于“/etc/greenwich/”中,但是当 cron 启动它时,运行脚本的当前目录是用户主目录(在大多数情况下),并且在当前目录中创建“$targetfile”。

请使用您希望在其中创建文件的完整路径定义“$targetfile”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-19
    • 1970-01-01
    • 2022-01-20
    • 2013-10-10
    • 2017-12-02
    • 2018-08-10
    相关资源
    最近更新 更多