在通用的现代 unix 环境(例如 GNU/Linux、GNU/Solaris 或 Mac OS X)中,是否有一种好方法可以确定特定绝对文件路径所在的挂载点和文件系统类型?
我想我可以执行mount命令并手动解析该命令的输出并将其与我的文件路径进行字符串比较,但在此之前我想知道是否有更优雅的方法。
我正在开发一个使用扩展属性的 BASH 脚本,并希望让它为各种文件系统和主机环境做正确的事(在可能的范围内)。
我只想捕获时间命令的输出,即:
X=$(time ls)
或者
$(time ls) | grep real
不过,时间函数会将其吐到控制台。我该怎么做呢?
我的 bash 脚本遇到了一些问题。
下面是我的 bash 代码:
#!/bin/bash
cd /root/Msgs/TESTNEW/new
file=myfile.txt
var1=$(awk '(NR==30){print $2}' $file)
var2=$(awk 'NR>=38 && NR<=39' $file)
var3=${var2// /+}
curl "http://<server_ip>/power_sms/send_sms.php?username=<user>&password=<pass>phoneno=$var1&text=$var3"
Run Code Online (Sandbox Code Playgroud)
该脚本用于读取特定文件(例如:myfile.txt)中的一系列行。然后它将文件的内容放入某个变量(var1,var2)中。之后,该变量将被调用到 curl 函数中。
当文件的内容在每个新行中都有间距时,问题就开始了。这使得 curl 无法正常工作,因为它不接受空格字符。我设法将间距替换为加号符号。但是每当有新行时,它将有间距而不是加号。
部分输出如下:
hi+there.hopefully+you+can+get+this+email+which+are being+send+as+sms.
Run Code Online (Sandbox Code Playgroud)
有人可以帮助我吗?谢谢。
我有几个应用程序和脚本,我想将输出重定向到自定义文件。
我使用这些应用程序启动
command | logger -t TAG
Run Code Online (Sandbox Code Playgroud)
我想根据它们的标签过滤这些消息并将它们重定向到不同的文件。我不想使用 bash 重定向,因为这些应用程序主要是长时间运行的进程并且需要适当的日志轮换。
我尝试在 /etc/rsyslog.d/60-myfilter.conf 中添加自定义过滤器;
if $syslogtag == 'giomanager' then /var/log/giomanager.log
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么 ?根据标签进行过滤的正确方法是什么,或者是否有更好的选择来获得类似的结果?
我在 /etc/init.d/ 中创建了一个脚本,它必须从其他(非 root 特权)用户的主目录运行其他几个脚本,就好像他们启动了它们一样。
我使用以下命令启动这些脚本: sudo -b -u <username> <script_of_a_particular_user>
它有效。但是对于继续运行的每个用户脚本(例如一些看门狗),我看到一个相应的父 sudo 进程,仍然活着并以 root 身份运行。这会在活动进程列表中造成混乱。
所以我的问题是:如何从现有的 bash 脚本中以另一个用户身份启动(fork)另一个脚本并将其保留为孤立(独立)进程?
更详细的解释:
我基本上是想为机器上的其他用户提供一种在系统启动或系统关闭时运行东西的方法,方法是运行在其主目录中的各个子目录中找到的可执行文件,名为 .startUp 和 .shutDown。由于我没有找到任何其他方法来做到这一点,因此我编写了完全执行此操作的 bash 脚本,并且已将其配置为 /etc/init.d/ 中的服务脚本(按照框架示例),因此当它运行时使用 start 参数启动 .startUp 目录中的所有内容,当使用 stop 参数运行时,它启动所有用户的 .shutDown 目录中的所有内容。
或者,如果我可以使用一些现有的解决方案来解决这个问题,我也很感兴趣。
更新
我环顾了一下,发现了这个问题:https :
//unix.stackexchange.com/questions/22478/detach-a-daemon-using-sudo
那里接受的答案,使用:sudo -u user sh -c "daemon & disown %1",对我有用。但我也试过没有拒绝 %1,结果是一样的。所以这就是我所期望的:
sudo -u <username> bash -c "<script_of_a_particular_user> &"
Run Code Online (Sandbox Code Playgroud)
我现在的另一个问题是,为什么它可以在没有拒绝的情况下工作?无论如何,对于某些潜在的特殊情况,我是否仍然应该离开拒绝电话?
更新 2
显然这也有效:
su <username> -c "<script_of_a_particular_user> &"
Run Code Online (Sandbox Code Playgroud)
这个调用和 sudo 调用有什么区别吗?我知道这可能是一个完全不同的问题。但由于我自己在这里找到答案,也许为了这个话题,有人可以在这里澄清这一点。
更新 3 …
隐藏 shell 命令的输出通常涉及重定向 stderr 和 stdout。是否有任何内置工具或命令在默认情况下隐藏输出但在错误时转储所有累积的输出?我想将它作为远程ssh命令的包装器运行。现在我让它们使用重定向,但我不知道是什么导致它们失败,而且它们太冗长了。
编辑:最后,我根据@Belmin 的回答创建了以下模板,我稍微调整了一下以从脚本中累积所有以前的命令,使用当前进程标识符,自动删除日志,并添加失败红色错误出现问题时的消息。在此模板中,初始silent包装器将成功,然后第三个命令失败,因为该目录已存在:
#!/bin/sh
set -e
SILENT_LOG=/tmp/silent_log_$$.txt
trap "/bin/rm -f $SILENT_LOG" EXIT
function report_and_exit {
cat "${SILENT_LOG}";
echo "\033[91mError running command.\033[39m"
exit 1;
}
function silent {
$* 2>>"${SILENT_LOG}" >> "${SILENT_LOG}" || report_and_exit;
}
silent mkdir -v pepe
silent mkdir -v pepe2
silent mkdir -v pepe
silent mkdir -v pepe2
Run Code Online (Sandbox Code Playgroud) 所以当我在 Fedora 中运行它时,我看到了这个:
$ ls hmm_data/indivA12_AATAAG/refs/par1/
2R-orths.alleles 2R-ref.alleles
$ ls hmm_data/indivA12_AATAAG/refs/par1/ | grep -F '-ref.alleles'
2R-ref.alleles
Run Code Online (Sandbox Code Playgroud)
但是当我在 Ubuntu(相同数据)上运行时,我没有从 grep 中得到任何结果:
$ ls hmm_data/indivA12_AATAAG/refs/par1/
2R-orths.alleles 2R-ref.alleles
$ ls hmm_data/indivA12_AATAAG/refs/par1/ | grep -F '-ref.alleles'
Run Code Online (Sandbox Code Playgroud)
任何想法可能会发生什么?我怎样才能想出在两个系统上都能正常工作的东西?
我有一个命令可以产生这样的输出:
$./command1
word1 word2 word3
我想将这三个词作为参数传递给另一个命令,如下所示:
$ command2 word1 word2 word3
如何将 command1 输出作为三个不同的参数 $1 $2 $3 传递给 command2 ?
我有一个在主机上运行并创建/启动/停止 docker 容器的脚本。我希望脚本更改容器内 root 用户的密码。
由于容器是 ssh 服务器,我尝试了:
sshpass -p 'OLDPASS' ssh root@<container-IP> 'echo -e "NEWPASS\nNEWPASS" | passwd root'
但它不起作用。在继续并花更多时间调试它之前,我想知道是否有更聪明的方法来做到这一点。
我知道正确的“docker 方式”是制作一个由 Dockerfile 运行的脚本,该脚本从共享卷中提取密码并将其设置为 root 密码。这听起来很复杂,但我知道怎么做,并且适用于我使用的另一个 docker 映像。但我不想为这个而做。
我只需要一个使用 Docker 或 ssh 以非交互方式更改用户密码的命令。