Articles of bash

将别名<cmd>透明地改为“do X then <cmd>”

标题很糟糕,但我不确定我想要做什么的正确术语,如果我知道我现在可能已经find了答案! 问题: 由于每当端口23被扫描,一个过分热心的端口扫描器(客户的networking监视器)和一个过于简单化的telnet守护进程(busybox linux),telnetd启动另一个 /bin/login实例,等待用户通过telnetinput。 由于端口扫描器并没有真正尝试login,所以没有会话,所以不会有会话超时,所以我们很快就会运行一个百万个僵尸拷贝/bin/login 。 我想要做的是: telnetd给了我们启动一些其他东西 ( -l )而不是/bin/login所以我想我们可以用一个bash脚本来replace/bin/login ,这个脚本会杀死旧的login进程,然后正常运行/bin/login : #!/bin/sh # First kill off any existing dangling logins # /bin/login disappears on successful login so # there should only ever be one killall -q login # now run login /bin/login 但是这似乎立即返回(没有错误,但没有login提示)。 我也尝试在telnetd的参数中链接命令: telnetd — -l "killall -q login;/bin/login" 但是,这似乎并没有工作(再次 – […]

杀死和睡眠命令在bash脚本中不能正常工作

我有一个bash脚本: #!/bin/sh for ((i=0; i<=10; i++)); do ssh "w$i" 'uptime;ps -elf|grep httpd|wc -l;free -m;mpstat' done & pid=$! sleep 3 kill -9 $pid 如果在3秒内没有完成,我想在for loop杀死ssh 。 但是我的观察是,这个过程没有被杀死,而且这个循环需要3秒钟以上的时间来杀死。 你能帮我纠正我的脚本,所以我的脚本可以杀死3秒后for loop过程?

比较bash脚本中的md5和

我试图用md5sum比较bash脚本中的两个文件。 目标是使用一个文件的.md5来检查另一个文件的md5sum 。 我的谷歌search如何以正确的方式做到这一点,并没有告诉我如何做到这一点。 烧掉电子邮件就像你期望的那样工作。 现在我试图让它在失败而不是成功的情况下发送一封电子邮件。 也许列出从.md5文件收到的结果和损坏文件的实际md5sum。 我会解决这个问题,最终,但是这有点令人困惑,因为我试图弄清楚我要去哪里错了。 Shellcheck指出代码看起来不错,但我没有得到我期望得到的结果。 几个StackOverflow链接,我检查了一下,看看是否可以工作: 一 二 这里是我的bash脚本的内容,它的原始forms: #!/bin/bash cd /home/example/public_html/exampledomain.com/billing/system/ || exit rm -rf GeoLiteCity.dat curl -L https://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz | gunzip > GeoLiteCity.dat curl -L https://geolite.maxmind.com/download/geoip/database/GeoLite2-City.mmdb.gz | gunzip > GeoLite2-City.dat curl -L https://geolite.maxmind.com/download/geoip/database/GeoLite2-City.md5 md5sum GeoLite2-City.dat > md5sum.txt file1="md5sum.txt" file2="GeoLite2-City.md5" if [ "`cat $file1`" != "`cat $file2`" ]; then mail -s […]

长时间运行的PHP脚本在通过exec()调用时停止,但在通过CLI调用时结束

我有一堆需要很长时间才能完成的脚本。 其中一些可能需要长达20分钟。 有一个执行这些PHP脚本的Bash脚本。 当我以root的身份通过CLI调用这个Bash脚本时,所有的PHP脚本都没有任何问题。 但是当我用PHP的exec()函数通过浏览器调用Bash脚本时,脚本在7/8分钟后突然停止,而不会引发任何错误。 对于通过Apache / PHP执行的进程或脚本可以运行的时间是否有一定的限制? 我试过了: set_time_limit(0) exec('nohup /path/to/bashscript') exec('/path/to/bashscript | at now') 最后两个尝试过的解决scheme已经被长期运行脚本有问题的其他人推荐,但是它根本没有帮助我。 注意:执行PHP脚本的Bash脚本是CakePHP的控制台应用程序。 我必须通过这个Bash脚本执行PHP脚本来利用CakePHP的所有function(模型,shell方法等)。 我需要能够通过浏览器调用Bash脚本,并让它在后台运行。 服务器是VPS,并安装了WHM / cPanel。

使用stdin通过/ proc / {pid} / fd / 0发送命令到java -jar

我试图使用/ proc / {pid} / fd / 0发送一个命令到我的世界服务器jar,但服务器不执行命令。 要复制我正在尝试做的事情,你可以在基于Debian的机器上(也可能是其他的Linux分发版)来做这件事。 我用什么来testing这个: Ubuntu 14.04 minecraft_server.jar (testing1.8) OpenJDK运行环境(使用default-jre-headless安装) 第一个控制台 $ java -jar minecraft_server.jar nogui 响应:[…服务器启动并等待input] say hi 响应:[19:52:23] [Server thread / INFO]:[Server] hi 第二个控制台 现在,当我切换到第二个控制台,与服务器仍然在第一我写: echo "say hi2" >> /proc/$(pidof java)/fd/0 一切都很好,直到我切换回第一个控制台。 我可以看到文字“说hi2”但服务器没有识别它。 我可以在第一个控制台再次写入另一个命令,就好像从第二个控制台input的文本还没有存在。 为什么是这样? 更重要的是,如何以正确的方式使用/ proc / {pid} / fd / 0将命令发送到java jar文件? 我不知道这是否是某种我不知道的Java事物,如果我在执行服务器时可以使用某个标志或某些东西,或者它是服务器JAR本身就是问题。 我知道你可以使用screen,tail -f或者某种服务器封装来实现这个function,但这不是我所追求的。 我想以某种方式发送一个使用这个方法的命令。 […]

我怎样才能sorting在Linux Bash shell中的string数组?

例如,数组是 link2_pathname link1_pathname link3_pathname 我怎样才能得到像下面的数组。 link1_pathname link2_pathname link3_pathname 提前感谢!

我怎么能暂停,然后恢复呼叫`睡眠`

调用sleep(10)意味着睡眠指定的秒数。 当我input“睡眠10”时,我想等待10秒钟,但是当我在睡眠命令之后立即使用CTRL-Z(或发送SIGTSTP )时,它不会停止“定时器”(或计数器),即使进程已经停止。 我可以通过jobs看到sleep已经改变为STOPPED但是如果我等待10秒,然后将这个过程发送到前台,它将立即完成 ,即使它运行的时间less于10秒。 所以,我的问题是如何停止睡眠定时器运行? 更新 ::我现在明白,睡眠是使用挂钟时间,所以我怎么能用一个用户cpu时间来实现睡眠

shell如何处理无限循环

无论何时我需要限制shell命令输出,我使用较less的分页结果: cat file_with_long_content | less 这工作得很好,但是我很好奇,即使输出永远不会结束,仍然可以工作,请考虑在inf.sh文件中使用以下脚本: while true; do date; done 然后我跑 sh inf.sh | less 而且它仍然可以对结果进行重新分页,所以说pipe道输出结果而不是等待命令完成才能输出结果是正确的吗?

Shell脚本问题,包含空格的文件名

我知道处理文件名空间的一种方法是用单引号括起文件名:“'”。 为什么下面的代码叫做“echo.sh”,在包含带空格的文件名的目录下工作,但程序“ls.sh”不起作用,唯一的区别是'echo'被'ls'replace? echo.sh #!/bin/sh for f in * do echo "'$f'" done 生产 : 'ABC' “高清” 'echo.sh' 'ls.sh' 但是,“ls.sh”失败: #!/bin/sh for f in * do ls "'$f'" done 生产 : ls:不能访问'ab c':没有这样的文件或目录 ls:不能访问'de f':没有这样的文件或目录 ls:不能访问'echo.sh':没有这样的文件或目录 ls:不能访问'ls.sh':没有这样的文件或目录

不能创build/ dev / stdout:没有这样的设备或地址

我想通过节点运行一个shell命令并捕获stdout的结果。 我的脚本在OSX上正常工作,但不在Ubuntu上。 我已经将问题和脚本简化为以下节点脚本: var execSync = require('child_process').execSync, result = execSync('echo "hello world" >> /dev/stdout'); // Do something with result 结果是: / bin / sh:1:不能创build/ dev / stdout:没有这样的设备或地址 我试图用/dev/stdout /dev/fd/1replace/dev/stdout 我已经尝试将shell更改为bash … execSync('echo …', {shell : '/bin/bash'}) 就像我说的,上面的问题被简化了。 真正的脚本接受作为参数的结果应写入文件的名称,所以我需要通过提供对stdoutstream作为文件描述符(即/dev/stdout访问来解决此问题。 我怎样才能通过节点执行命令,同时给命令访问它自己的标准输出stream?