标签: bash

如何将多行变量作为参数传递给函数

试图捕获和显示 curl 的输出让我发疯。我终于找到了一种解决方法,但我不明白为什么需要它。

这是一个失败的脚本:

#!/bin/bash
function echo_output() {
    echo $@
}

CURL_OUTPUT=$(curl -sL --head www.google.com/foobar)
echo_output "$CURL_OUTPUT"
Run Code Online (Sandbox Code Playgroud)

这是一个有效的脚本:(转义回车)

#!/bin/bash
function echo_output() {
    OUT="${@//[$'\r']/\r}"
    echo $OUT
}

CURL_OUTPUT=$(curl -sL --head www.google.com/foobar)
echo_output "$CURL_OUTPUT"
Run Code Online (Sandbox Code Playgroud)

是什么赋予了?换行符和“$@”有什么特别之处?谢谢您的帮助。

linux bash

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

使用“curl | bash”反馈远程执行脚本

我正在一个使用很多这样的命令的平台上工作: ssh login@server.com 'curl http://some_server/script.sh | bash'

这对于远程执行脚本来说非常干净和方便,但是,无论如何我都看不到获取脚本的输出/退出代码。任何人都可以找出一些方法来确保脚本已正确执行(从启动 ssh 的主机的角度来看)。

remote-access ssh bash remote curl

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

Tmux 和 encryptfs 在重新连接时导致“(无法访问)”目录

我正在运行带有加密主目录 (encryptfs) 的 Ubuntu 13.04 服务器。我保持一个 tmux 会话处于打开状态,其中包含我的开发环境(vim 等)。当我断开连接时,我将断开 tmux 会话,然后断开 ssh 连接。稍后,当我重新连接并重新附加 tmux 会话时,我会收到如下错误:

fatal: Could not change back to '(unreachable)/*****': No such file or directory
Run Code Online (Sandbox Code Playgroud)

这通常意味着 vim(在分离时仍然打开)保存到错误的位置,并且实际上不会将文件写入磁盘,只会写入“无法访问”目录,这似乎是临时的。

如果我从 bash运行 ' pwd '(重新连接后没有做任何其他事情),我会得到正确的目录/home/***/***。如果我运行 'git status',我会得到上面的消息(没有这样的文件),如果我在 vim 中运行' :pwd ',我会得到“ (unreachable)/*** ”。

对此的临时解决方法是运行 ' cd 。' 在运行任何其他命令之前,它允许 git/vim/etc 实际查看目录。这很不方便,因为我经常在 tmux 中打开许多面板/屏幕,我必须运行 ' cd 。' 每次我重新连接时。最重要的是,我必须确保在断开连接之前关闭 vim 或其他任何东西,否则如果我不小心,我可能会丢失数据。

我在某处看到另一个线程,将此归因于 encryptfs在注销时卸载$HOME,但没有回复。这似乎是一个可能的原因,但我不知道从哪里开始。有什么帮助吗?

linux bash tmux

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

防止带有 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
查看次数

杀死所有当前正在运行的 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
查看次数