我对 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后跟反引号有一个特殊的构造,它返回退出代码而不是输出。我错了吗?
我知道以前有人问过这个问题,但我正在努力确定我的脚本错误的根本原因。我已经解决了其他问题并尝试转换它(将 /\ 切换为 @),但它对我不起作用,我仍然遇到相同的错误???
一旦我添加了最后 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' 的未知选项
但我看不到如何解决这个问题,有人可以帮我吗??
提前致谢..
我有使用 的 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 等效结果的方法?换壳不是这台机器的选项。
奇怪的是,这对我不起作用。
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命令是否成功吗?
我需要在屏幕上看到输出,同时 grep 输出并将 grep 结果发送到变量。我认为它可以用 T 恤完成,但我不知道具体如何。我试过
mycommand | tee myvar=$(grep -c keyword)
mycommand | tee >(myvar=$(grep -c keyword))
Run Code Online (Sandbox Code Playgroud)
但这不起作用。应该如何,最好不要写入文件?
大约 10 年前,我问过这个问题
并得到了这个有用的命令 find . -type f -print0 | xargs -0 sed -i 's/regex_search_term/replace_term/g'
我决定更多地了解find,xargs和sed语句。在 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 系统兼容?
我正在寻求有关 Linux 服务器 (CentOS) 指南或脚本的帮助,当检测到新的 SFTP 连接时,这些指南或脚本可用于向服务器帐户发送电子邮件。例如,提供连接名称和请求 IP 地址以及连接身份验证类型(如果可能)(例如 SSH 密钥或密码等)。
我几乎没有使用 Bash 脚本的经验,但是我已经成功地做到了这一点,它可以检测 SSH 连接;但是我不知道在哪里扩展它以将SFTP 连接的电子邮件地址通知给服务器,
非常感谢您对此的任何帮助。
我确实意识到这是一个非常糟糕的问题,我道歉,但搜索引擎结果给了我很多错误的结果,例如“我如何 SFTP 到我的服务器?!” 等明显不合适的。
干杯
所以/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) 使用以下命令将机器加入域时遇到问题。服务器的操作系统为 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) 在我连接到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。
我正在尝试设置一些规则来阻止 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)