标签: bash

在 *nix 中,如何确定特定文件在哪个文件系统上?

在通用的现代 unix 环境(例如 GNU/Linux、GNU/Solaris 或 Mac OS X)中,是否有一种好方法可以确定特定绝对文件路径所在的挂载点和文件系统类型?

我想我可以执行mount命令并手动解析该命令的输出并将其与我的文件路径进行字符串比较,但在此之前我想知道是否有更优雅的方法。

我正在开发一个使用扩展属性的 BASH 脚本,并希望让它为各种文件系统和主机环境做正确的事(在可能的范围内)。

unix files filesystems bash unix-shell

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

将 unix 中时间命令的输出重定向到 bash 中的变量?

我只想捕获时间命令的输出,即:

X=$(time ls)

或者

$(time ls) | grep real

不过,时间函数会将其吐到控制台。我该怎么做呢?

linux bash

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

使用 AWK 删除换行符

我的 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)

有人可以帮助我吗?谢谢。

linux bash awk

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

“sudo -i”和“sudo bash -l”有什么区别

最近有一个关于多个系统管理员以 root 身份工作的问题sudo bash -l并被引用。

我搜索了这对谷歌和SE,但我不明白之间的差别sudo bash -lsudo -i

从 bash 和 sudo 的手册页看来,不同之处可能在于sudo bash -l运行 root 用户的 ~/.bash_profile、~/.bash_login 和 ~/.profile 以及 ~/.bash_logout,但从我自己的测试来看,它看起来像它运行普通用户的 .bashrc 而不是根用户。我可能误解了 ~ 表达式在手册页中引用了哪个用户。对差异和使用场景的澄清将不胜感激。

linux bash root sudo

13
推荐指数
2
解决办法
3553
查看次数

如何按标签过滤 rsyslog 消息

我有几个应用程序和脚本,我想将输出重定向到自定义文件。

我使用这些应用程序启动

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)

我究竟做错了什么 ?根据标签进行过滤的正确方法是什么,或者是否有更好的选择来获得类似的结果?

bash logging syslog rsyslog

13
推荐指数
2
解决办法
4万
查看次数

以其他用户身份启动脚本

我在 /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 …

linux debian bash sudo init.d

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

仅在成功时隐藏 shell 命令的输出?

隐藏 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)

linux shell bash

13
推荐指数
4
解决办法
7397
查看次数

grep 在 Fedora 和 Ubuntu 上的表现不同

所以当我在 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)

任何想法可能会发生什么?我怎样才能想出在两个系统上都能正常工作的东西?

ubuntu bash fedora grep

13
推荐指数
2
解决办法
967
查看次数

如何将命令输出作为多个参数传递给另一个命令

我有一个命令可以产生这样的输出:

$./command1
word1 word2 word3

我想将这三个词作为参数传递给另一个命令,如下所示:

$ command2 word1 word2 word3

如何将 command1 输出作为三个不同的参数 $1 $2 $3 传递给 command2 ?

linux unix shell bash shell-scripting

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

如何从脚本在 docker 容器中设置 root 密码?

我有一个在主机上运行并创建/启动/停止 docker 容器的脚本。我希望脚本更改容器内 root 用户的密码。

由于容器是 ssh 服务器,我尝试了: sshpass -p 'OLDPASS' ssh root@<container-IP> 'echo -e "NEWPASS\nNEWPASS" | passwd root'

但它不起作用。在继续并花更多时间调试它之前,我想知道是否有更聪明的方法来做到这一点。

我知道正确的“docker 方式”是制作一个由 Dockerfile 运行的脚本,该脚本从共享卷中提取密码并将其设置为 root 密码。这听起来很复杂,但我知道怎么做,并且适用于我使用的另一个 docker 映像。但我不想为这个而做。

我只需要一个使用 Docker 或 ssh 以非交互方式更改用户密码的命令。

ssh bash passwd docker

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

标签 统计

bash ×10

linux ×6

shell ×2

sudo ×2

unix ×2

awk ×1

debian ×1

docker ×1

fedora ×1

files ×1

filesystems ×1

grep ×1

init.d ×1

logging ×1

passwd ×1

root ×1

rsyslog ×1

shell-scripting ×1

ssh ×1

syslog ×1

ubuntu ×1

unix-shell ×1