标签: bash

作为 crontab 运行时,Linux Bash IF 条件未处理

因此,我为自己制作了一个小脚本,用于监视我的服务目录中是否存在已更改的任何 PHP 文件。它旨在从 crontab 每 5 分钟运行一次,并将任何更改通过电子邮件发送给我,以便我可以检查它们。

有很多网站在机器上运行,如果你知道我的意思,我希望能够关注任何新脚本以确保那里没有我不喜欢的外观。

问题是当我从命令行运行脚本时,脚本运行 100% 正常,但它不能从 crontab 正确运行。该脚本包含在下面:

rm /root/sec/email
find /var/www/ -name '*.php' -not -name '*.tpl.*' -type f -mtime -0.005 -exec ls -al {} \;  > /root/sec/email
if [[ -s /root/sec/email ]] ; then
        mail -s "PHP Change Alert on FSE4" matt@aroxo.com muji@aroxo.com < /root/sec/email
        echo "It ran" >> /root/sec/log
else
        echo "It did not run" >> /root/sec/log
fi ;
Run Code Online (Sandbox Code Playgroud)

问题在于 IF 条件。即使名为“email”的文件的大小不为零,if 子句的错误一侧也会触发(else)。

任何想法我做错了什么?

干杯,

马特。

linux bash cron

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

以编程方式向 crontab 添加两行

我正在尝试在构建 AWS 实例时向根 crontab 添加两行。我有一组命令是“用户数据”的一部分。这些命令在创建实例时以 root 身份运行。我想将这两行添加到 crontab 中:

@daily /home/ubuntu/db-backup-to-s3-daily.sh
@hourly /home/ubuntu/db-backup-to-s3-hourly.sh
Run Code Online (Sandbox Code Playgroud)

我正在使用以下方法(基于对这个问题的回答):

(crontab -u ubuntu -l ; echo -e "@daily /home/ubuntu/db-backup-to-s3-daily.sh\n@hourly /home/ubuntu/db-backup-to-s3-hourly.sh") | crontab -u ubuntu -
Run Code Online (Sandbox Code Playgroud)

但是,这在创建实例时不起作用,但如果我登录并运行此行,它确实起作用。有什么不同的方法可以将行附加到 crontab 吗?

bash cron amazon-ec2 ubuntu-12.04

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

Bash 在变量中转换字符

我正在用 bash 编写一个 collectd nagios 自定义检查脚本。我遇到的问题是 nagios 将主机名显示为 host.name.domain 但 collectd 将 WSP 文件保存为 host_name_domain。我的问题是如何使变量将从 nagios (host.name.domain) 获取的主机名转换为 collectd 格式 (host_name_domain)。

这是必须发生转换的部分。所以 WSP_PATH 会在变量 $NHOST 中给出主机名的 collectd 格式

WSP_PATH=/var/lib/carbon/whisper/ctd/$NHOST/uptime/uptime.wsp
Run Code Online (Sandbox Code Playgroud)

bash collectd

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

用于检查和响应内存使用情况的一行脚本

我想要一行 shell/bash 来做一些事情:

test "`free | grep | awk | whatever` -gt 80" && any_command
Run Code Online (Sandbox Code Playgroud)

将整个系统使用的 ram总百分比与硬编码数字(在我的情况下为 80)进行比较。test只要any_command在 ram 高于给定百分比时执行就无关紧要。

  • 确切的字节/兆字节而不是百分比是可以的
  • 这应该适用于典型的 ubuntu 14.04
  • 用作 cron 作业
  • 奖励:做同样事情的单线,但检查特定过程的 ram

更新

有关于这是如何构建 monit/bluepill/god 之类的问题的答案。我 100% 同意,您很可能应该遵循这些答案中的建议。但是,这个问题特别是关于我所描述的确切路线,无论出于何种原因,假设这可能涉及所有注意事项和问题。

ubuntu shell bash

3
推荐指数
2
解决办法
7620
查看次数

将 curl 与 cookie 结合使用

我希望有人可以帮助我解决这个问题。我已经尝试了一段时间了,有各种各样的变化,似乎无法让它发挥作用。

我正在尝试编写一种方法来登录https://login.three.ie/以从 */My_account_balance 检查帐户余额

我已经尝试了各种 wget 命令,但从我读到的内容来看,curl 更有可能完成这项任务。

我一直在尝试我在网上遇到的变体,包括从这里开始的 stackoverflow,但似乎没有任何效果。

这是我尝试的最后一个:

    curl -X POST -c cookies.txt -u "Uern@me:P@ssw0rd" https://login.three.ie/
Run Code Online (Sandbox Code Playgroud)

这确实将 cookie 文件保存在此处:

    $ cat cookies.txt

    Netscape HTTP Cookie File

    #http://curl.haxx.se/docs/http-cookies.html
    This file was generated by libcurl! Edit at your own risk.
    HttpOnly_login.three.ie        FALSE   /       FALSE   1433988274
    laravel_session eyJpdiI6IkFZWmxvZ2oyXC9NNGVIbHVpejZwRWp3PT0iLCJ2YWx1ZSI6Imxkd25UKzBoMldiQlhYZVJnVUpuNUVsblZ1cGJYZWcwM2E1bTtIWHRiQ2pwV0VwemJ4NFlYcDlzTndSeFRNanpwdDhMMTIrS2RGZGdGd0RNZU1yREJ3PT0iLCJtYWMiOiI0NWUwYzc1TY4ODI3ZmY3ODY5NjliODkxODMyODIzMjQwNmNkNjljNTE2NzQxNmQ4MzhhNDljNTdjM2QwZGY1In0%3D
Run Code Online (Sandbox Code Playgroud)

但是当我尝试重新使用 cookie 时,它​​看起来像是重定向或其他东西,因为这就是我得到的:

    $ curl -b cookies.txt  https://my3account.three.ie/My_account_balance
    <html><head><title>302 Moved Temporarily</title></head>
    <body bgcolor="#FFFFFF">
    <p>This document you requested has moved temporarily.</p>
    <p>It's now at <a href="https://sso.three.ie/mylogin//login?auth-        
    required=seamless&amp;service=https&#37;3A&#37;F&#37;                   
    2Fmy3account.three.ie&#37;2FMy_account_balance">https://sso.three.ie/mylogin//login?auth-required=seamless&amp;service=https&#37;3A&#37;2F&#37;2Fmy3account.three.ie&#37;2FMy_account_balance</a>.</p>
Run Code Online (Sandbox Code Playgroud)

我不明白这里发生了什么。有没有人知道出了什么问题,或者更好,如何解决这个问题?

谢谢

scripting bash wget curl shell-scripting

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

即使报告错误“无法创建目录:失败”,sftp 也会返回代码 0

我正在尝试编写一个负责在远程服务器上创建文件夹的 Bash 脚本。

片段:

!/bin/bash -e
echo "Creating remote folder."
echo mkdir test_folder | sftp -oPort=22 192.168.0.11:/tmp
if [[ $? != 0 ]]; then
  echo "Transfer failed!"
  exit 1
else
  echo "Transfer complete."
fi
echo $?
Run Code Online (Sandbox Code Playgroud)

输出是:

Connected to 192.168.0.11.
Changing to: /tmp
sftp> mkdir test_folder
Couldn't create directory: Failure
Transfer complete.
0
Run Code Online (Sandbox Code Playgroud)

所以返回码是 0 但显然有错误。

如何捕获远程错误并在脚本中设置适当的返回码?

bash sftp

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

如何从sudo用户检查root环境变量?

如何从 sudo 用户检查 root 环境变量?我尝试了 su 和 sudo 的各种键和组合,但没有运气。

比如普通用户$HISTFILESIZE=2000,root用户9999。

vagrant@default-debian-78-64-nocm:~$ echo $HISTFILESIZE
2000
vagrant@default-debian-78-64-nocm:~$ sudo -i
root@default-debian-78-64-nocm:~# echo $HISTFILESIZE
9999
Run Code Online (Sandbox Code Playgroud)

但是当我尝试通过 sudo 获取 root $HISTFILESIZE 时 - 它总是返回 2000:

vagrant@default-debian-78-64-nocm:~$ sudo -i echo $HISTFILESIZE
2000
vagrant@default-debian-78-64-nocm:~$ sudo -i su - -c "echo $HISTFILESIZE"
2000
vagrant@default-debian-78-64-nocm:~$ sudo -i bash -c "echo $HISTFILESIZE"
2000
vagrant@default-debian-78-64-nocm:~$ sudo -i bash -l -c "echo $HISTFILESIZE"
2000
Run Code Online (Sandbox Code Playgroud)

bash sudo environment-variables

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

将标准输入传递给 LXC 容器时,Bash shell 脚本会乱序执行

我将以下简单的 shell 脚本传递给 LXC 容器上的 bash:

apt-get update
apt-get install postgresql -y

sudo -u postgres psql -c 'create database dvdrental;'
Run Code Online (Sandbox Code Playgroud)

我用来运行它的实际命令是:

cat sample.sh | lxc-attach -n test-container -- /bin/bash
Run Code Online (Sandbox Code Playgroud)

我这样做而不是将脚本上传到容器并以这种方式执行的原因是,这只是我们正在构建的更复杂的应用程序的概念证明,该应用程序必须通过标准输入接收命令并运行它们在容器中。

它似乎工作得很好,除了一件事。它psql在 postgresql 仍在安装时移动到命令上,即,

[...]
Get:21 http://archive.ubuntu.com/ubuntu/ trusty/main ssl-cert all 1.0.33 [16.6 kB]
Get:22 http://archive.ubuntu.com/ubuntu/ trusty-updates/main postgresql-common all 154ubuntu1 [103 kB]
Get:23 http://archive.ubuntu.com/ubuntu/ trusty-updates/main postgresql-9.3 amd64 9.3.10-0ubuntu0.14.04 [2,669 kB]
Get:24 http://archive.ubuntu.com/ubuntu/ trusty-updates/main postgresql all 9.3+154ubuntu1 [5,038 B]
Fetched 5,834 kB in 28s (207 kB/s)                                             
Preconfiguring packages ...

    sudo -u …
Run Code Online (Sandbox Code Playgroud)

bash lxc ubuntu-14.04

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

卡在单尖括号提示处

我实验性地跑了,if bat1 == 1 then echo yes fi并被困在一个单角括号提示炼狱中,其中Ctrl+cz无法打开门。有什么建议?

bash

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

Linux shell 脚本“没有那个文件或目录”

我创建了一个 shell 脚本来完成 3 个简单的任务(压缩一个目录,重命名最终文件并删除源目录)。脚本源码如下:

#!/bin/bash
if [[ $2 == *"/data/"* ]]
then
    src= $2"/*";
    dest= $1".zip";

    # Just for test
    echo $src;

    # Commented for now
    #zip -r -j $dest $src
    #mv $dest $1
    #rm -rf $2
else
    echo "Invalid arguments";
fi
Run Code Online (Sandbox Code Playgroud)

当我使用这些参数运行上面的脚本时,出现错误:

./scriptzip.sh /data/file-new /data/file-old

./scriptzip.sh: line 4: /data/file-old/*: No such file or directory
./scriptzip.sh: line 5: /data/file-new.zip: No such file or directory
Run Code Online (Sandbox Code Playgroud)

如何防止外壳程序测试“类似目录”字符串的变量?有什么办法可以跳过吗?

linux bash sh

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