标签: bash

bash 中反引号的评估

我对 bash 中反引号的评估感到困惑。我以前见过这样的代码,这是有道理的:

RESULT=`whoami`
Run Code Online (Sandbox Code Playgroud)

这将whoami命令的输出存储在RESULT变量中,并确认反引号计算为其中的命令输出。但我也看到过如下代码:

if `wget google.com -T 2 -t 1 -o /dev/null`; then 
   echo "Internet ok"
fi
Run Code Online (Sandbox Code Playgroud)

这是通过尝试获取 google 主页来测试互联网连接(-t 1一次尝试,-T 2一次 2 秒超时,并重定向到,/dev/null因为它实际上并不想要输出,而只是想看看它是否成功)。代码读起来好像作者期望反引号将评估为wget命令的退出代码而不是输出。

但它确实有效。它打印Internet ok是否可以连接到 google.com,如果我将 url 更改为一些不存在的无意义 url,它不满足 if 语句并且不打印任何内容。我不明白为什么这有效。

wget使用有效和无效的 url独立运行命令在两种情况下都不会打印任何内容,只是退出代码有所不同。

我的结论是,if后跟反引号有一个特殊的构造,它返回退出代码而不是输出。我错了吗?

linux bash

2
推荐指数
1
解决办法
2305
查看次数

sed: -e 表达式未知选项到`s'

我知道以前有人问过这个问题,但我正在努力确定我的脚本错误的根本原因。我已经解决了其他问题并尝试转换它(将 /\ 切换为 @),但它对我不起作用,我仍然遇到相同的错误???

一旦我添加了最后 4 个(从底部开始)表达式,我就开始出现错误,..

当我运行这个

clustername="'XXXCluster'"  
seed=xx.xxx.xxx.xx  
ip=xx.xxx.xxx.xx  
hint="/opt/cassandra/data/hints"  
data="/opt/cassandra/data/data"  
commitlog="/opt/cassandra/data/commitlog"  
cache="/opt/cassandra/data/saved_caches"  

sed -i -e "s/\(cluster_name:\).*/\1$clustername/" \  
-e "s/\(- seeds:\).*/\1$seed/" \  
-e "s/\(listen_address:\).*/\1$ip/" \  
-e "s/\(rpc_address:\).*/\1$ip/" \  
-e "s/\(broadcast_rpc_address:\).*/\1$ip/" \  
-e "s/\(hints_directory:\).*/\1$hint/" \  
-e "s/\(data_file_directory:\).*/\1$data/" \  
-e "s/\(commitlog_directory:\).*/\1$commitlog/" \  
-e "s/\(saved_caches_directory:\).*/\1$cache/" /opt/cassandra.yaml  
Run Code Online (Sandbox Code Playgroud)

我得到了这个 sed:-e 表达式 #6,字符 29:`s' 的未知选项

但我看不到如何解决这个问题,有人可以帮我吗??

提前致谢..

linux shell bash

2
推荐指数
1
解决办法
8460
查看次数

在 zsh 上获得与在 bash 上执行 `type -t` 时得到的结果相同的结果吗?

我有使用 的 shell 脚本type -t,但显然它最初是为bash编写的,而在这台机器上我使用的是zsh,因此它不起作用。

我看到 bash 文档type -t

如果使用 -t 选项,则 type 打印一个单词,它是“别名”、“函数”、“内置”、“文件”或“关键字”之一,如果名称是别名、shell 函数、shell 内置、磁盘文件,或外壳保留字,分别。如果未找到名称,则不打印任何内容,并且 type 返回失败状态。

但是在 zsh 中,type不接受该-t选项,它实际上别名为whence

输入 [ -fpam ] name ... 与 wherece -v 相同。

从哪里来:

对于每个名称,指出如果用作命令名称将如何解释它。'-v' 标志生成更详细的报告。'-c' 标志以类似 csh 的格式打印结果并优先于 '-v'。'-f' 标志导致显示 shell 函数的内容,否则不会发生,除非使用 '-c' 标志。'-p' 标志对 name 进行路径搜索,即使它是别名、保留字、shell 函数或内置函数。'-a' 标志在整个命令路径中搜索所有出现的 name。使用 '-m' 标志,参数被视为模式(应该用引号引起来),并且显示与这些模式之一匹配的每个命令的信息。

其中不包括所需的输出。一种在zsh上获得 en 等效结果的方法?换壳不是这台机器的选项。

bash zsh

2
推荐指数
1
解决办法
635
查看次数

Grepping 'nginx -t' 结果

奇怪的是,这对我不起作用。

nginx -t | grep -c 'successful' | awk '{if ($0==0) print "not found"; else if ($0>0) print "found"}'
Run Code Online (Sandbox Code Playgroud)

即使结果如下,它也会返回一个not found

nginx: [warn] conflicting server name "xxx.co.za" on 0.0.0.0:80, ignored
nginx: [warn] conflicting server name "xxx.co.za" on 0.0.0.0:443, ignored
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
not found
Run Code Online (Sandbox Code Playgroud)

即使是一个简单的 grep 也不会做预期的事情..

(nginx -t | grep -q 'successful') && echo "Yes" || echo "Nope"
Run Code Online (Sandbox Code Playgroud)

知道如何检查nginx -t命令是否成功吗?

nginx bash

2
推荐指数
1
解决办法
772
查看次数

tee 并分配给变量?

我需要在屏幕上看到输出,同时 grep 输出并将 grep 结果发送到变量。我认为它可以用 T 恤完成,但我不知道具体如何。我试过

mycommand | tee myvar=$(grep -c keyword)
mycommand | tee  >(myvar=$(grep -c keyword))
Run Code Online (Sandbox Code Playgroud)

但这不起作用。应该如何,最好不要写入文件?

linux bash pipe tee

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

从 find 和 xargs 中删除 -print0 和 -0 标志

大约 10 年前,我问过这个问题

在 linux 中递归使用 SED?

并得到了这个有用的命令 find . -type f -print0 | xargs -0 sed -i 's/regex_search_term/replace_term/g'

我决定更多地了解find,xargssed语句。在 bash 版本 4.4.20(1)-release 的 Ubuntu 18.04 上,我可以将语句简化为:

find . -type f -print | xargs sed -i 's/regex_search_term/replace_term/g'

然后可以再次简化为:

find . -type f | xargs sed -i 's/regex_search_term/replace_term/g'

所以我的问题是,是否有任何缺点不使用-print0标志和 -0国旗find,并xargs分别?-print完全放弃标志有什么缺点吗?它们是否明确用于与不同的类 Unix 系统兼容?

bash find xargs

2
推荐指数
1
解决办法
187
查看次数

用于检测(并通过电子邮件通知)到服务器的新 SFTP 连接的 Linux Bash 脚本

我正在寻求有关 Linux 服务器 (CentOS) 指南或脚本的帮助,当检测到新的 SFTP 连接时,这些指南或脚本可用于向服务器帐户发送电子邮件。例如,提供连接名称和请求 IP 地址以及连接身份验证类型(如果可能)(例如 SSH 密钥或密码等)。

我几乎没有使用 Bash 脚本的经验,但是我已经成功地做到了这一点,它可以检测 SSH 连接;但是我不知道在哪里扩展它以将SFTP 连接的电子邮件地址通知给服务器,

非常感谢您对此的任何帮助。

我确实意识到这是一个非常糟糕的问题,我道歉,但搜索引擎结果给了我很多错误的结果,例如“我如何 SFTP 到我的服务器?!” 等明显不合适的。

干杯


更新 1

所以/var/logs/secure收集SFTP连接信息。我希望能够以某种方式获取该信息并将其发送到基本电子邮件中。

我当前工作的 SSH 检测器在.bashrc以下位置执行此操作:

echo -e 'ALERT - SSH access detected:' `date` `ls -l \`tty\` | awk '{print $3}'` '\n\nConnection Details: ' `w -h` '\n\nList of WHO: ' `who --login` | mail -s "Alert: Server Access Email Subject" email@address.com
Run Code Online (Sandbox Code Playgroud)

这被称为,由 CSF (ConfigServerFirewall) 触发

我想以某种方式将上述两者结合起来,以便在将信息行添加到/var/log/secure诸如以下内容时:

Subsystem       sftp    /usr/libexec/openssh/sftp-server …
Run Code Online (Sandbox Code Playgroud)

linux bash sftp

2
推荐指数
1
解决办法
935
查看次数

错误:KDC 回复与预期不符

使用以下命令将机器加入域时遇到问题。服务器的操作系统为 Almazon Linux 2 服务器,必须加入 example.com。

我已经完成了 Li 的域加入过程所需的所有先决条件 下面是我尝试过的命令。

sudo realm join -U <username>@example.com dc01.example.com -v
Run Code Online (Sandbox Code Playgroud)

开/关:

Could not get kerberos ticket: KDC reply did not match expectations
Run Code Online (Sandbox Code Playgroud)

linux bash sssd realm

2
推荐指数
1
解决办法
3565
查看次数

容器退出后如何退出docker exec?

在我连接到docker exec -ti的 docker 退出后,如何优雅地退出我已经连接到的 docker 容器?

如果我退出原始容器,则运行该docker exec命令的 shell会挂起,我能找到退出回其 shell 的唯一方法是docker exec从另一个终端终止该命令。

有没有更优雅的方式?

无论我是否启动容器,都会发生这种情况--rm

我在 Ubuntu 20.04 的 gnome-terminal 3.26.3 中的 bash 5.0.16 下运行 docker 19.03.12。

ubuntu bash containers docker

2
推荐指数
1
解决办法
5935
查看次数

设置iptables规则后无法访问实例

我正在尝试设置一些规则来阻止 TCP(SSH 和 FTP)上除 21 和 22 之外的所有端口。但是当我尝试运行这个脚本时,我被锁定在我的实例之外并且无法访问它。这是脚本:

# Flush the FW Rules 
iptables -F
iptables -X

# Block all traffic
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

# Allow SSH
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 22 -j ACCEPT

# Allow FTP
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 21 -j ACCEPT

# Allow ICMP (ping)
iptables …
Run Code Online (Sandbox Code Playgroud)

bash iptables shell-scripting

2
推荐指数
1
解决办法
161
查看次数

标签 统计

bash ×10

linux ×5

containers ×1

docker ×1

find ×1

iptables ×1

nginx ×1

pipe ×1

realm ×1

sftp ×1

shell ×1

shell-scripting ×1

sssd ×1

tee ×1

ubuntu ×1

xargs ×1

zsh ×1