标签: bash

Bash:美元括号中的两个命令没有相同的行为

我不明白为什么,在 Bash 中:

  • echo $(hostname --fqdn) 作品,
  • echo $(id -un)没有(id: –un: No such user)。

反引号给出相同的结果。

使用这种表示法有什么好的做法吗?id 命令以这种方式使用它有什么特别之处吗?

下面,一些细节似乎适用于其他系统:

  • lsb_release -a:SUSE Linux Enterprise Server 11 (x86_64),
  • which id: /usr/bin/id,
  • id -un 单独工作。

linux shell bash command

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

如何使用新的 ifdown 和 ifup?

我想改变一个Fedora 20的网络服务器的MAC地址,但它的接缝ifdownifup像他们使用过多介绍systemd之前不起作用。这就是我想做的

ifdown eth0
ifconfig eth0 hw ether 00:E0:81:5C:B4:0F
ifconfig eth0 up
Run Code Online (Sandbox Code Playgroud)

以太网卡被调用em1并使用 dhcp。

# ifdown em1
usage: ifdown <device name>
Run Code Online (Sandbox Code Playgroud)

我如何在new ifdownifup.

networking linux bash fedora fedora-20

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

Bash 脚本匹配 grep 输出并发送消息

我正在开发一个用于 monit 状态检查的脚本,以便我可以将 OK 状态消息发送到 NagiOS NSCA 服务器(被动检查)。我遇到的问题是,如果脚本 grep 函数不包含任何会触发消息发送的内容,我的 bash 脚本仍会发送消息。

脚本:

变量

rsysl='rsyslog'
log='messages'
Run Code Online (Sandbox Code Playgroud)

变量中的命令

host=$(hostname)
monstat=$(monit status|grep -C 1 '$rsysl')
nsca_status=$(echo -e "$host\t$rsysl\t0\tOK" | /usr/sbin/send_nsca -H mon.lv.lan -c /etc/send_nsca.cfg)
Run Code Online (Sandbox Code Playgroud)

监控状态命令

# Postfix check
$monstat
Run Code Online (Sandbox Code Playgroud)

如您所见,消息发送功能仅在状态等于未运行不可访问时发送消息

if [ "status" == "not running" ] && [ "status" == "not accessible" ]; then
   $nsca_status
else
   :
fi
Run Code Online (Sandbox Code Playgroud)

Grep 输出(在实际情况下,消息发送命令必须匹配运行可访问

# monit status|grep -C 1 'rsyslog'

Process 'rsyslog'
  status                            Running
-- …
Run Code Online (Sandbox Code Playgroud)

scripting bash monit

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

如何绕过sudo

我正在尝试编写Meteor(JS 框架)的非交互式安装脚本和部分脚本提示 sudo 。我似乎无法通过我的脚本技能来克服它。

安装是: curl https://install.meteor.com | /bin/sh

在脚本的稍后点,它会提示输入 Sudo 密码。 我希望这一步失败。然后我可以围绕分辨率编写脚本。

注意:我无法将用户添加到 sudoers 文件,它在不允许我的用户提升访问权限的共享环境中运行。

bash sudo

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

CentOS 6.5 代理绕过/no_proxy 不起作用

我在我的桌面上运行 CentOS 6.5。我已经设置了Network Proxy使用下提供的网络代理应用程序Preferences。我还设置了以下例外: localhost,127.0.0.0/8,172.16.0.0/12,192.168.0.0./16

但是每当我使用 wget(我正在使用 wget 测试代理设置)时,wget 都会尝试连接到私有地址的代理,但wget localhost工作正常并且不使用代理。

我还删除了所有代理设置并在 shell 中设置了代理:

export http_proxy="<proxy_url>:<port>"
export https_proxy="<proxy_url>:<port>"
export no_proxy="localhost,127.0.0.0/8,172.16.0.0/12,192.168.0.0./16"
Run Code Online (Sandbox Code Playgroud)

它工作时,我用命令wget <external_url>或者wget localhost但是当我使用该命令将失败wget <private address from the $no_proxy variable>

我还尝试在 Ubuntu 14.04 中设置变量并面临同样的问题。

编辑:我发现 shell 忽略了 CIDR 表示法。如果我需要在没有代理的情况下浏览 127.0.0.1 那么我需要在no_proxy变量中输入 127.0.0.1而不是 127.0.0.0/8

linux bash proxy http-proxy linux-networking

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

查找设备的 IPv4 广播地址

我需要使用 shell 脚本确定设备(如果有)的 IPv4 广播地址。如果有多个,选择一个(例如第一个由 /sbin/ip 排序)。

我有一个解决方案,但我不喜欢它,因为它对 /sbin/ip 的输出格式做出了假设,而且我不知道该输出格式跨系统的稳定性如何。

DEV=eth0
BROADCAST=`ip address show $DEV | grep 'inet .* brd ' | head -1 | sed -e 's/^.* brd \([0-9\.]*\) .*$/\1/'`
echo $BROADCAST
Run Code Online (Sandbox Code Playgroud)

在 /proc/ 或 /sys/ 中不是有什么东西可以让我简单地捕捉吗?为什么不?

我需要该解决方案能够可靠地工作,至少在 Debian/Ubuntu Linux 家族中是如此。


编辑:这不是关于 sed/awk/grep 魔法的问题。问题是:

  • 我是否可以期望ipifconfig就此而言)跨架构和 Linux 风格具有相同的输出格式,以便我可以可靠地解析例如接口的 IPv4 广播地址?
  • 如果不是:是否有另一种方式以更可预测的方式输出接口的 IPv4 广播地址?
  • 为什么没有我可以简单的 /proc/sys/net/ipv4/conf/eth0/{address,mask,broadcast} cat

linux debian bash

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

linux + at 命令 + 如何终止作业

我使用 at 命令每隔一分钟运行一次任务(测试脚本)

 at -f /tmp/test now +1 minute
 commands will be executed using /bin/tcsh
 job 1438153690.a at Wed Jul 29 10:08:10 2015
Run Code Online (Sandbox Code Playgroud)

但如何杀死这个工作?(1438153690.a) 如果需要?

linux bash at

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

无法在 bash 脚本中使用从 .bashrc 导出的函数

我的.bashrc文件导出一个名为的函数lookup

lookup() {
  grep -r -ne "$1" * | grep -v "TAGS:" | grep -v "tags:"
}
export -f lookup
Run Code Online (Sandbox Code Playgroud)

我可以在 shell 中使用该函数。但是如果我把它放在这样的脚本中:

#!/bin/bash
lookup "foo"
Run Code Online (Sandbox Code Playgroud)

并运行脚本,然后 bash 报告“未找到命令” lookup。这曾经工作过一段时间。我强烈怀疑这在我的系统上的 bash 安全更新后停止工作(可能与 shellshock/bashdoor 相关?)我的 bash 版本是 openSUSE 11.4 上的 4.1.10(1)

bash bashrc

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

无法将 NGinx 版本存储到变量

这似乎是一个愚蠢的问题,但我似乎无法将nginx -v输出存储到变量中,甚至无法将其写入 bash 中的文件。 php --version并且mysql --version似乎工作正常,但 Nginx 不会保存。有没有办法做到这一点。我在尝试:

NGINX_VERSION=$(nginx -v)
nginx -v > /home/user/nginxversion.txt
Run Code Online (Sandbox Code Playgroud)

PHP 以同样的方式工作正常,但 nginx 不会保存。

PHP_VERSION=$(php --version)
php -v > /home/user/phpversion.txt
Run Code Online (Sandbox Code Playgroud)

scripting nginx bash centos7

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

我不小心删除了 /var/log/syslog,现在 rsyslog 不会记录任何内容

我不小心删除了 /var/log/syslog,以为系统会自动重新创建它(它没有)。

我使用touch /var/log/syslog并重新启动了 rsyslog,但系统仍然没有记录任何内容。我也重新启动了整个服务器无济于事。

的输出 ls -l /var/log/syslog

-rwxrwxr-x 1 root root 0 Oct 27 13:16 syslog

如何让系统再次开始记录到 syslog?

给未来读者的注意事项

重新启动 rsyslog 确实解决了这个问题。第一次对我不起作用的原因是因为我使用touch /var/log/syslog.

解决方案是 delete /var/log/syslog。然后运行sudo service rsyslog restart

TLDR;不要自己创建文件。删除 syslog,然后重新启动 rsyslog(它将为您创建 syslog)。问题解决了。

linux bash logging rsyslog ubuntu-16.04

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