标签: bash

防止带有 FS 路径值的环境变量的 bash 选项卡完成删除环境变量名称

朋友们,

我在 Linux 上使用 GNU bash 作为我的 shell:

$ bash --version
GNU bash, version 4.2.45(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
$ 
Run Code Online (Sandbox Code Playgroud)

当我设置一个以 FS 路径作为其值的环境变量时,它的行为非常奇怪。

假设我想将 /opt/database/bin 添加到 PATH 的前面。

我首先输入:

$ export PATH=/o
Run Code Online (Sandbox Code Playgroud)

然后我按下键盘上的 Tab 键。

但是它没有完成 /opt 的路径,而是删除了 PATH= 部分!相反,我得到:

$ export /opt/
Run Code Online (Sandbox Code Playgroud)

当然,那对我来说非常无用,而且非常恼人!然后我需要手动添加环境变量名称,这根本不是我想要做的!

我希望它完成它: …

bash command-line-interface environment-variables path

5
推荐指数
1
解决办法
837
查看次数

grep 不一致地默认为 grep -P?

我有一个脚本可以做一些内务处理,当从交互式 shell 调用时它运行良好,但在被 cron 调用时什么也没做。为了解决这个问题,我使用以下命令启动了一个带有“空白”环境的 shell:

env -i /bin/bash --noprofile --norc
Run Code Online (Sandbox Code Playgroud)

使用这个空白环境,我已经深入到我的脚本中,发现以下内容grep与任何文件都不匹配:

grep -il "^ws_status\s*=\s*[\"']remove[\"']$"
Run Code Online (Sandbox Code Playgroud)

但是,当从交互式 shell 运行时,该命令将返回匹配文件的文件名。

请注意,该表达式匹配如下行: WS_STATUS = "remove"

通过反复试验,我发现将-P选项添加到 [Perl regex] 中,命令开始在“空白”shell 中正常工作。但是,我不知道为什么我的登录 shell 似乎默认为grep -P.

  • 只有一个grep二进制,/bin/grep
  • 没有为grep=pgrep或定义别名grep="grep -P"
  • 没有GREP_OPTIONS定义环境变量。

这里有什么交易?

注:操作系统为 RHEL v5.10,Bash 为 v3.2.25,grep 为 v2.5.1

linux bash grep environment-variables

5
推荐指数
1
解决办法
300
查看次数

如何并行化scp命令?

我需要从SCP的文件machineB,并machineCmachineA。我正在从machineA. 我已经正确设置了 ssh 密钥。

如果文件不存在的machineB,那么它应该是那里machineC。我需要将所有 PARTITION1 和 PARTITION2 文件移动到 machineA 各自的文件夹中,如下所示在我的 shell 脚本中 -

#!/bin/bash

readonly PRIMARY=/export/home/david/dist/primary
readonly SECONDARY=/export/home/david/dist/secondary
readonly FILERS_LOCATION=(machineB machineC)
readonly MAPPED_LOCATION=/bat/data/snapshot
PARTITION1=(0 3 5 7 9)
PARTITION2=(1 2 4 6 8)

dir1=$(ssh -o "StrictHostKeyChecking no" david@${FILERS_LOCATION[0]} ls -dt1 "$MAPPED_LOCATION"/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] | head -n1)
dir2=$(ssh -o "StrictHostKeyChecking no" david@${FILERS_LOCATION[1]} ls -dt1 "$MAPPED_LOCATION"/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] | head -n1)

length1=$(ssh -o "StrictHostKeyChecking no" david@${FILERS_LOCATION[0]} "ls '$dir1' | wc -l")
length2=$(ssh -o …
Run Code Online (Sandbox Code Playgroud)

linux ubuntu shell bash scp

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

使用 tc qdiscs 进行带宽限制

我试图限制一个简单的 iperf 服务器和客户端之间的带宽,使用第三台被动机器作为桥梁。在没有干扰的情况下,iperf 返回约 90 Mbits/sec 的带宽。我的目标是创建一个根 qdisc,将所有未分类的流量(所有内容)发送到子 HTB 类,在那里设置我的带宽,然后路由到叶 qdisc,一旦我开始工作,将在其中设置额外的 tc 参数。我的实现很简短:

sudo tc qdisc add dev $interface root handle 1: htb default 10

sudo tc class add dev $interface parent 1:0 classid 1:10 htb rate $bandwidth burst $burst

sudo tc qdisc add dev $interface parent 1:10 handle 10:0 netem #other stuff goes here
Run Code Online (Sandbox Code Playgroud)

当这个 bash 脚本在带有$interface = eth1, $bandwidth = 500kbps,的网桥上实现时$burst = 15k,我看到 iperf 带宽有所减少,但还没有接近规定值(通常约为 5Mbps)。

我的脚本中有错误吗?我是否滥用了突发变量?请帮忙。

更新:经过进一步调查,我发现这种流量控制在应用于与 SERVER 接口的以太网卡时工作正常,但是当将相同的命令应用于 CLIENT 端时会出现问题。当整个设置颠倒时也是如此。

bash iperf traffic-shaping tc htb

5
推荐指数
1
解决办法
863
查看次数

从命令行而不是文件将私钥传递给 scp

有没有办法将私钥的内容直接传递给scp命令,而不必将其复制到文件并通过-i /path/to/key.pem选项指向它?

所以,而不是做:

scp -i key.pem source target

我可以执行以下操作吗?

scp -i '-----BEGIN RSA PRIVATE KEY-----\nMIIEowIBAAMIIEowIBAA...\n' source target

当然,我试过这个,但它不起作用,但也许这可以通过一些 BASH 管道、输出重定向或类似的东西来实现。

我需要这样做的原因是因为我无法将密钥存储在文件系统中(这是一个非常漫长而无聊的故事),并且该命令每次都需要使用不同的密钥执行数百万次,因此额外的磁盘 i/o 对我们的结果很重要。

bash scp private-key

5
推荐指数
1
解决办法
9660
查看次数

rsync 不删除目标中的文件夹

我知道这里有一些相同主题的问题,但没有答案对我有帮助。

首先,这是我的脚本。它应该将所有文件从源复制到目标(保留所有权限等)。如果文件或目录在源中被删除,它也应该在目标中被删除。哪个工作不正常。

#!/bin/bash
## Basic RSync Command
RCMD="rsync -rulpEXogtzh --stats --delete --force"
DDIR="/tank/bak/s1/archive/"
SDIR="/tank/bak/s1/backup/"
CDAY=`date '+%u'`

echo "Archive Number: ${CDAY}"
echo "Archiving current backup"
$RCMD $SDIR $DDIR/$CDAY
Run Code Online (Sandbox Code Playgroud)

如果我在源中有以下目录:

/etc
/home
/root
/usr
Run Code Online (Sandbox Code Playgroud)

并同步它们我在目标中有以下目录:

/etc
/home
/root
/usr
Run Code Online (Sandbox Code Playgroud)

所以这很好用。现在,当我从源中删除 /usr 时,我的源如下所示:

/etc
/home
/root
Run Code Online (Sandbox Code Playgroud)

但是当我再次运行脚本时,我的目标仍然是这样的:

/etc
/home
/root
/usr
Run Code Online (Sandbox Code Playgroud)

所以不知何故 rsync 忽略了 --delete

rsync 输出:

Number of files: 1983645
Number of files transferred: 0
Total file size: 17.69G bytes
Total transferred file size: 0 bytes
Literal data: 0 bytes
Matched data: …
Run Code Online (Sandbox Code Playgroud)

bash rsync

5
推荐指数
1
解决办法
7313
查看次数

杀死所有当前正在运行的 cron 作业

出于某种原因,我的 cron 作业脚本没有完全退出,它们正在备份我的服务器。目前有几百个进程在为我的一个用户运行。我可以使用以下命令杀死该用户的所有进程,但是如何简化它以仅杀死 cron?

pgrep -U username | while read id ; do kill -6 $id ; done
Run Code Online (Sandbox Code Playgroud)

按原样运行上述命令会很危险,对吗?这不会杀死 mysql 和其他重要的东西吗?

bash command-line-interface process cron unix-shell

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

为什么有些 CentOS 5 机器在升级 Bash 后仍然容易受到 ShellShock 的攻击?

我有两个 CentOS 5.10 boxen,已升级bash到最新版本。但是,在其中一个框中,bash仍然容易受到攻击CVE-2014-7169(我正在使用此 ServerFault answer 中的测试)。

关于为什么一台机器可以而另一台机器不行的任何想法?我可以检查什么?

我已经检查过的:

1- 确保两台机器都运行相同的操作系统(两台机器的输出相同):

# cat /etc/redhat-release
CentOS release 5.10 (Final)
Run Code Online (Sandbox Code Playgroud)

2- 确保我有相同的版本bash(两者输出相同):

# rpm -qi bash
Name        : bash                         Relocations: (not relocatable)
Version     : 3.2                               Vendor: CentOS
Release     : 33.el5_10.4                   Build Date: Thu 25 Sep 2014 08:58:19 PM UTC
Install Date: Sat 27 Sep 2014 02:07:07 PM UTC      Build Host: sclbuild-c5.centos.org
Group       : System Environment/Shells     Source RPM: bash-3.2-33.el5_10.4.src.rpm
Size        : 5235475                          License: …
Run Code Online (Sandbox Code Playgroud)

security bash centos yum rpm

5
推荐指数
1
解决办法
2478
查看次数

如何使用分页grep连续流

我将此发布给超级用户,但没有人接受:https : //superuser.com/questions/832578/how-to-grep-a-continuous-stream-with-paging

我想获取一个日志文件并过滤掉一些不相关的日志条目,例如 INFO 级别的日志条目。上面的 Stack Overflow 答案让我受益匪浅:

$ tail -f php_error_log | grep -v INFO
Run Code Online (Sandbox Code Playgroud)

我想要的下一部分是在此流中进行分页,例如使用 less。less +F 适用于连续流,但我不能将其应用于 grep。我怎样才能做到这一点?


自从发布该问题以来,我一直在研究它并发现它less正在等待 EOF 出现,并挂起直到它收到它(来源)。这解释了为什么尝试跟随管道不起作用。我编写了一个简短的脚本来做我想做的事,不优雅:

#!/bin/bash
tail -f /data/tmp/test.txt | grep --line-buffered foo > /data/tmp/foo &
pid=$!
echo $pid
sleep 1
less +F /data/tmp/foo
kill $pid
rm /data/tmp/foo
Run Code Online (Sandbox Code Playgroud)

我相信可以更优雅地做到这一点,也许使用一个无需直接交互即可自动清理的临时文件。

linux bash grep less

5
推荐指数
1
解决办法
2335
查看次数

您将如何通过脚本向 smb.conf 添加共享?

我想编写将共享添加到smb.conf文件的脚本。我当前的脚本只是将它附加到文件的末尾,但这并不理想。我宁愿有一些东西,如果它不存在就会添加一个新的共享,如果它存在就替换它。

我目前正在 CentOS 7 发行版上编写此脚本,但理想情况下会喜欢跨发行版工作的东西,尽管这不是必需的。

另外,我bash之所以这样做,是因为脚本是在将其他包添加到系统之前运行的。该脚本用于yum安装samba软件包,然后应该对其进行配置并添加共享。

configuration shell bash samba

5
推荐指数
1
解决办法
4164
查看次数