给你一个简单的。我们可以在 Bash 中做这样的事情,而不使用 IF 语句吗?
a=0
b=0
c=1
result= [ a || b || c ] # result of binary operation should be 1
这可能吗?
给你一个简单的。我们可以在 Bash 中做这样的事情,而不使用 IF 语句吗?
a=0
b=0
c=1
result= [ a || b || c ] # result of binary operation should be 1
这可能吗?
操作系统 Ubuntu Linux 18.04.2
Webmin 版本 1.900(最新)
Usermin 版本 1.751(最新)
Virtualmin 版本 6.06-2(最新)
我对 Dovecot 和 Usermin/Virtualmin 有疑问。该问题仅影响域用户(主要虚拟服务器用户) - 创建的所有其他用户,可以登录到 Usermin 并访问电子邮件正常。
因此,当我创建一个名为 test.com 的新虚拟服务器时,我单击“编辑用户部分”中的“登录到 usermin”按钮,然后 Usermin 打开并登录用户“test”。您将立即在 syslog 和邮件中看到这一点。日志:
Jul 7 00:49:17 ns1 dovecot: imap-login: Disconnected (auth failed, 1 attempts in 6 secs): user=<>, method=PLAIN, rip=127.0.0.1, lip=127.0.0.1, secured, session=<abVjLgqNer1/AAAB>
Jul 7 00:49:17 ns1 dovecot: imap-login: Disconnected (auth failed, 1 attempts in 8 secs): user=<>, method=PLAIN, rip=127.0.0.1, lip=127.0.0.1, secured, session=<eapMLgqNeL1/AAAB>
Jul 7 00:49:28 ns1 dovecot: imap-login: Disconnected (auth failed, 1 attempts in 10 secs): user=<>, method=PLAIN, rip=127.0.0.1, lip=127.0.0.1, secured, session=<4ynZLgqNfL1/AAAB>
Jul 7 00:49:45 ns1 dovecot: imap-login: Disconnected (auth failed, 1 attempts in 27 secs): user=<>, method=PLAIN, rip=127.0.0.1, lip=127.0.0.1, secured, session=<sKHZLgqNfr1/AAAB>
Jul 7 00:49:45 ns1 dovecot: imap-login: Disconnected (auth failed, 1 attempts in 17 secs): user=<>, method=PLAIN, rip=127.0.0.1, lip=127.0.0.1, secured, session=<t5RqLwqNgL1/AAAB>
身份验证日志:
Jul 7 00:49:06 ns1 perl: pam_unix(usermin:auth): authentication failure; logname= uid=0 euid=0 tty= ruser= rhost= user=root
我在这里发现了类似的问题:
https
://www.virtualmin.com/node/38732
不同之处在于我的用户在日志中显示为空白。
另外,我在目录 /home/test/.usermin/mailbox和这里没有 inbox.imap 文件:
https ://www.virtualmin.com/node/64389
我该如何解决这个问题?有任何想法吗?
服务 dovecot 状态 = 活动(运行)
dovecot -n
2.2.33.2 (d6601f4ec): /etc/dovecot/dovecot.conf
Pigeonhole version 0.4.21 (92477967)
OS: Linux 4.15.0-54-generic x86_64 Ubuntu 18.04.2 LTS
auth_mechanisms = plain login
disable_plaintext_auth = no
mail_location = maildir:~/Maildir
mail_privileged_group = mail
namespace inbox {
inbox = yes
location =
mailbox Drafts {
special_use = \Drafts
}
mailbox Junk {
special_use = \Junk
}
mailbox Sent {
special_use = \Sent
}
mailbox "Sent Messages" {
special_use = \Sent
}
mailbox Trash {
special_use = \Trash
}
prefix =
}
passdb {
driver = pam
}
protocols = imap pop3 pop3
ssl_ca = </dovecot.key.ca
ssl_cert = </etc/dovecot/private/dovecot.pem
ssl_cipher_list = ECDHE-RSA-AES256-SHA384:AES256-SHA256:AES256-SHA256:RC4:HIGH:MEDIUM:+TLSv1:+TLSv1.1:+TLSv1.2:!MD5:!ADH:!aNULL:!eNULL:!NULL:!DH:!ADH:!EDH:!AESGCM
ssl_client_ca_dir = /etc/ssl/certs
ssl_key = # hidden, use -P to show it
userdb {
driver = passwd
}
local_name test.com {
ssl_cert = </home/test/ssl.cert
ssl_key = # hidden, use -P to show it
}
local_name www.test.com {
ssl_cert = </home/test/ssl.cert
ssl_key = # hidden, use -P to show it
}
local_name mail.test.com {
ssl_cert = </home/test/ssl.cert
ssl_key = # hidden, use -P to show it
}
尝试安装 linux-image-extra-virtual 时,我收到有关 /boot/grub/menu.lst 被修改的常见提示:
What would you like to do about it ? Your options are:
install the package maintainer's version
keep your currently-installed version
etc
在我的自动化脚本中,我试图避免此提示,并使其默认保留所述文件的当前版本。我尝试了其他地方建议的这个,但仍然得到提示:
apt-get --yes -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" install linux-image-extra-virtual
我该怎么做呢?
更新:我会试试这个方法:停止来自 apt-get 的交互式提示
我曾经这样做:
declare -g var='value'
. ~script.sh sub
我var
可以从我的子目录中读取和修改。
现在我有一个二进制文件,而不是script.sh
我想要相同的功能。当然,现在我不能这样做,. ~/script.bin sub
因为 bash'cannot execute binary file'
相反,我必须:
declare -g var='value'
~/script.bin sub
我如何 ~/script.bin sub
阅读/修改我的var
?
declare -gx var='value'
我也试过:
export var='value'
但没有饼干。
我想刷新IPtables中的一些相关链。他们的名字就像'f2b.*' 我希望整个链条都消失了!例如,这一切都过去了。
-A f2b-postfix-sasl -s 103.231.139.130/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-postfix-sasl -s 141.98.9.2/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-postfix-sasl -s 45.13.39.56/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-postfix-sasl -s 185.36.81.61/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-postfix-sasl -s 185.36.81.169/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-postfix-sasl -s 185.36.81.165/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-postfix-sasl -s 185.137.111.22/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-postfix-sasl -s 185.137.111.188/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-postfix-sasl -s 185.137.111.123/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-postfix-sasl -j RETURN
-A f2b-ssh-ddos -s 193.201.224.214/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-ssh-ddos -j RETURN
我也希望链式规则消失:
-A INPUT -p tcp -m multiport --dports 22,115 -j f2b-ssh-ddos
-A INPUT -p tcp -m multiport --dports 25,465,587,143,993,110,995 -j f2b-postfix-sasl
基本上是这样的
iptables -F .*f2b-.*
iptables -D .*f2b-.*
你会怎么做?
[原因] 是因为我在关机时保存 iptables 并在重启时恢复。但是,fail2ban 会再次添加现有规则,而不检查它们是否已经存在。所以我最终得到了重复。
[UPDATE#1] 我可以得到这样的唯一链名:
sudo /sbin/iptables -S | grep -P '\-A f2b-.*' | cut -d ' ' -f 2 | sort -u
如何在不建立循环的情况下删除它们?
[我的配置] Ubuntu 18.04 - digitalocean droplet/server
[背景] 根据我的研究,我推测自 18.04 起 /etc/network/intefaces 已被弃用,并引入了名为 netplan 的东西。桌面获得 NetworkManager,而 server-Netplan 将控制权交给 systemd-networkd。
[问题] 让脚本在关机/重启时运行。我计划在 /etc/network/interfaces 中使用 pre-up/post-down,但由于上述原因,这对我不起作用。
具体来说,我要运行的脚本与在关机和重启时保存和恢复 iptables 有关。
[iptables-persistent] 请不要让我安装 iptables-persistent,因为即使在这种情况下,我仍然需要将 iptables 保存和恢复到单独的文件中,比如缓冲区。如果 iptables-persistent 可以以某种方式将其文件保存在不同的位置并在重新启动时加载该文件,我会考虑它。
有任何想法吗?
[我试过了]
我在 /etc/NetworkManager/dispatcher.d/01firewall 中创建了一个可执行文件没有结果。这是因为如上所述 NetworkManager 未在服务器安装中使用吗?
我在 /lib/systemd/system/ 中创建了一个服务:
[Unit]
Description=ipres
[Service]
ExecStart=/bin/sh -c '/sbin/iptables-save -c > /etc/blah/firewall/up.save'
ExecStop=/bin/sh -c '/sbin/iptables-save -c > /etc/blah/firewall/down.save'
[Install]
WantedBy=multi-user.target
部分成功,因为文件已创建但为空(是因为 iptables-save 功能太晚/太早了吗?)
我正在使用 iptables 添加一个链:
iptables -N ETDROP
当我重新启动时,这会丢失。我阅读了许多使 iptables 规则永久化的方法......但是
您必须记住,我正在使用 UFW,而 UFW 的工作就是记住您的规则。
那么问题来了,我如何让 UFW 意识到 iptables 刚刚直接添加了一条新规则?
我试过ufw reload
但没有饼干。
基本上我想在未注释的行上找到 foobar,例如:
// foobar # do not match me
foobar # match me
otherfoobar # do not match me
为了匹配我使用的注释行:^(\s*//\s*)\bfoobar\b.*$
如何匹配未注释的行?
笔记:
为避免不必要的努力,请将答案限制为“^...$”。这必须纯粹在发送到 perl 进行匹配的字符串中完成。
foobar 也必须像 \bfoobar\b 一样整体匹配
最后, \bfoobar\b 除了空格或注释签名之外,不应以任何内容开头。
Bash 4.4.19(1)-发布
我有一个简单的脚本,它是日志记录应用程序的基础。由于各种原因,我不得不使用进程替换。
这runner
是应用程序的核心,由于进程替换是异步的,我已经设法通过while
循环使其达到很好的一致性。它完美地工作。
不幸的是,我发现了一个不起作用的情况:当我执行 ' bash <filename> <function>
'
所以我们需要2个文件来重现。
要求:
简化的脚本是:
test.sh
#!/bin/bash
2sub() {
local in=$(cat); echo -e "$in";
}
runner () {
"${@}" 1> >(2sub)
while [ -e /proc/$! ]; do sleep 0.1; done # <<< LOOP WAIT FOR $!
}
remotesub() {
bash ./test2.sh remotesub2
}
echo -e "running\n";
runner bash ./test2.sh remotesub2 # LOOPS
# runner remotesub # A POSSIBLE BYPASS/SOLUTION? But why?
echo -e "done!\n"
test2.sh
remotesub2() {
echo -e "'${BASH_VERSION}'"
return 0
}
"$@"
旁路:
正如您从脚本中看到的那样,通过bash <filename> <function>
在函数内部包含并将函数传递给runner
. 为什么这是有效的,而不是直接的方式,我相信这里有人知道。
请阐明这个问题,以及是否有更好的方法来执行等待循环以涵盖这些情况。
解决方案:
最好的解决方案是 mosvy 建议的。谢谢你。使用 { "${@}"; }
消除了将命令打包在单独的小函数中的需要,这是一种痛苦。同样在用我的较大代码进行了数小时的测试后,我得出结论,仔细杀死子进程使得这while [ -e /proc/$! ]; do sleep 0.1; done
没有必要。那条线被替换为wait $!;
这是我的简化脚本。
我想知道 proc() 是否可以知道它是直接运行还是通过跑步者运行。
#!/bin/bash
runner () {
"${@}"
}
proc() {
eval 'version=$(echo "SUCCESS: **** ${BASH_VERSION} ****")'
echo -e "$version";
return 0
}
runner proc
proc
你怎么看?
注意:这个问题是由于“流程替换”的异步处理而出现的。脚本响应具有欺骗性,导致许多时间损失。之前有一篇相关的帖子在这里:进程替换中的猫挂起:它在等待什么?
Bash 4.4.19(1)-发布
使用此代码,因为我不能使用管道。
func() {
in=$(cat)
echo "'this is it: $in'"
}
echo "a string" > >(func)
不幸的是,这个 Process Substitution 正在打印提示以及我的字符串。
user@srv:~$ ./test.sh
user@srv:~$ 'this is it: a string'
这不适合我的使用!至少可以说!!!
可取的是像这样的正常行为:
user@srv:~$ ./test.sh
'this is it: a string'
我可以强制 Process Substitution 不打印 shell 提示吗?
注意:我不能使用管道......它给我带来了其他问题。 这些是它产生的问题: 我可以在将命令输出发送到文件(一个衬里)之前对其进行处理吗?
我有一个命令处理函数,它运行它的参数并将结果输出到一个文件中。这些命令的输出现在必须在转到文件之前进行处理。
我只有一个要求:echo "var is: $var"
必须显示将在代码中进一步使用的结果。
这打破了我的要求:"${@:1}" | perl -pe 's/\**//g' >> './test.log'
我想象这样的事情:
"${@:1}" 1>> perl -pe 's/\**//g' >> './test.log'
但它不起作用。
我已将代码简化为以下内容:
process() {
"${@:1}" 1>>'./test.log'
}
process eval 'var=$(echo -e "*****ONE *****WORD"); echo -e "$var";'
echo "var is: $var"
目前这个函数输出:
screen :"var is: *****ONE *****WORD"
logfile:"*****ONE *****WORD"
.
要求的结果:
screen :"var is: *****ONE *****WORD"
logfile:"ONE WORD"
我怎样才能做到这一点?
PS。muru 问我为什么使用 eval。我回答了,因为没有其他方法可以在不复制代码的情况下填充变量。不幸的是,我们在他的回答下的讨论被删除了。
我正在尝试从多行文本中提取 2 个字符串。
postmsg="\033[0;37m
Email
Settings"
这一行在字符串的开头找到了一些匹配项并将其放入变量 inCol 中。
inCol=$(perl -e 'print $1 if $ARGV[0]=~/^(\\033\[.*?m).*$/mi; ' -- "${postmsg}")
我还想抓住我尝试过的字符串的其余部分(基本上是.*$):
inVal=$(perl -e 'print $1 if $ARGV[0]=~/^\\033\[.*?m(.*)$/mi; ' -- "${postmsg}")
如果我的输入是单行字符串,这实际上有效。如果没有,那么什么都不会出现。
.*$
匹配到行尾...尝试过\Z
但没有。一个人试过.*
,什么都没有。
尝试了各种修饰符等...这一定很简单,但我找不到答案。
更好的是,如果这可以在一行中完成。而不是运行两次比赛。
更新:
这是我的新玩具:
问题是我希望它只匹配参数前面没有 #\s* 的行。
请不要提供替代代码,例如 sed 等。使用 perl
perl -we 'my $file= "parameter=9
# parameter=10
parameter=10
"; $file=~ s/.*((?<!^# ))parameter\s*=.*/parameter=replaced/g; print(":$file:\n")'
预期产出
parameter=replaced
# parameter=10
parameter=replaced
PS,如果您有兴趣了解我的进展情况,请看这里:Perl Negative Lookbehind with variable length bypass 也许?
我有一个多行字符串,我希望它首先被格式化为每行的特定长度,然后再将每行传递给一个函数进行行处理。
例如
description="\
NOTE:
This script should be run on a newly created server.
However it can also be re-run selectively even afterwards, to re configure your settings if they were messed up.
Ready to configure the server for the first time.
"
echo "$description" | fmt -w 80
我现在想遍历上面的输出并将每一行发送到一个函数。
我想象的是这样的(不起作用):
function testme() {
for var in "$@"
do
echo "$var"
done
}
echo "$description" | fmt -w 80 | testme
有任何想法吗?
我想在将变量写入文件之前转义变量中的引号。不幸的是,其中一些行有一些不愉快的项目。
(我想避免 foo 扩展。我希望 foo="ModPagespeedLoadFromFileRuleMatch disallow .*" 从字面上理解并在其上运行替换。我不想要任何扩展。它只是放置在文件中的指令。)
foo="ModPagespeedLoadFromFileRuleMatch disallow .*"
echo ${foo//\\/\\\\}
这给了我:
ModPagespeedLoadFromFileRuleMatch disallow . .. .bash_history .bashrc .cloud-locale-test.skip .filemin .gnupg .local .mysql_history .profile .rnd .rpmdb .ssh
我也试过这样:
foo='ModPagespeedLoadFromFileRuleMatch disallow .*';
bar=$( printf "$foo" | sed 's/\\/\\\\/g' );
echo $bar
foo='ModPagespeedLoadFromFileRuleMatch disallow .*';
bar=$( echo "$foo" | sed 's/\\/\\\\/g' );
echo $bar
同样的问题。
我在这里想念什么?
PS。尝试这个:
foo='ModPagespeedLoadFromFileRuleMatch disallow .*'
echo "$foo"
然后试试这个(我不希望在管道时发生这种情况):
foo='ModPagespeedLoadFromFileRuleMatch disallow .*'
echo "$foo" |
注意第二个例子中的管道
回答:
foo="ModPagespeedLoadFromFileRuleMatch\ disallow .*"
echo "${foo//\\/\\\\}"
foo='ModPagespeedLoadFromFileRuleMatch disallow .*';
bar=$( printf "$foo" | sed 's/\\/\\\\/g' )
echo "$bar"
foo='ModPagespeedLoadFromFileRuleMatch disallow .*';
bar=$( echo "$foo" | sed 's/\\/\\\\/g' );
echo "$bar"