标签: scripting

*nix 的面向对象 shell

前言:我喜欢 bash 并且无意开始任何形式的争论或圣战,希望这不是一个非常幼稚的问题。

这个问题与超级用户上的这篇文章有些相关,但我认为 OP 并不真正知道他在问什么。我在 FreeBSD、linux、OS X 和 Windows 上的 cygwin 上使用 bash。我最近在 Windows 上使用 PowerShell 也有丰富的经验。

是否有用于 *nix 的 shell,已经可用或正在开发中,它与 bash 兼容,但在混合中添加了一层面向对象的脚本?我所知道的唯一接近的是 python 控制台,但据我所知,它不提供对标准 shell 环境的访问。例如,我不能只是cd ~and ls,然后chmod +x file在 python 控制台中。我将不得不使用 python 来执行这些任务,而不是标准的 unix 二进制文件,或者使用 python 代码调用二进制文件。

这样的壳存在吗?

shell scripting bash architecture

43
推荐指数
4
解决办法
3万
查看次数

什么是 shell 双引号和单引号的好助记符?

我没有做足够的脚本来记住,不查找,双引号或单引号是否会导致 Unix 变量被替换。

我绝对明白发生了什么。我的问题是有没有人有记忆技巧可以让正确的引用规则留在我的脑海中?

shell scripting quoting

43
推荐指数
3
解决办法
3305
查看次数

以非交互方式创建 SSL 证书

我想默默地,非交互地,创建一个 SSL 证书。即,没有得到任何数据的提示。

我创建证书的正常方式是:

openssl req -x509 -nodes -days 7300 -newkey rsa:2048 \
    -keyout /etc/ssl/private/pure-ftpd.pem -out /etc/ssl/private/pure-ftpd.pem 
Run Code Online (Sandbox Code Playgroud)

我尝试了以下方法:

openssl genrsa -out server.key 2048
touch openssl.cnf

cat >> openssl.cnf <<EOF
[ req ]
prompt = no
distinguished_name = req_distinguished_name

[ req_distinguished_name ]
C = GB
ST = Test State
L = Test Locality
O = Org Name
OU = Org Unit Name
CN = Common Name
emailAddress = test@email.com
EOF

openssl req -x509 -config openssl.cnf -nodes -days 7300 \
    -signkey server.key …
Run Code Online (Sandbox Code Playgroud)

scripting ssl

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

如何运行 ssh 命令直到成功?

有时我会重新启动设备,并需要ssh在设备准备就绪后重新启动。

我想每 5 秒运行一次 ssh 命令,直到命令成功。

我的第一次尝试:

watch -n5 ssh me@device.local && exit 1
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

scripting ssh watch

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

Bash 抛出错误,第 8 行:$1:未绑定变量

我正在尝试学习如何使用 getopts 以便我可以使用解析输入的脚本(尽管我认为 getopts 可能会更好)。我正在尝试编写一个简单的脚本来返回分区使用百分比。问题是我的 bash 函数之一似乎不喜欢我$1在函数中作为变量引用。我引用的原因$1是因为该get_percent函数可以将挂载点作为可选参数传递给 display 而不是所有挂载点。

剧本

#!/usr/bin/bash

set -e
set -u
set -o pipefail

get_percent(){
    if [ -n "$1" ] 
    then
        df -h $1 | tail -n +2 | awk '{ print $1,"\t",$5 }'
    else
        df -h | tail -n +2 | awk '{ print $1,"\t",$5 }'
    fi
}

usage(){
    echo "script usage: $(basename $0) [-h] [-p] [-m mount_point]" >&2
}

# If the user doesn't supply any arguments, we …
Run Code Online (Sandbox Code Playgroud)

scripting bash shell-script

42
推荐指数
5
解决办法
10万
查看次数

条件结构中的分号

为什么把分号放在一个而不是另一个?

结果是一样的

代码一

if [ "a" == "a" ]
then
 echo "true"
fi
Run Code Online (Sandbox Code Playgroud)

代码二

if [ "a" == "a" ];
then
 echo "true";
fi
Run Code Online (Sandbox Code Playgroud)

第二个代码中的分号是不必要的吗?

什么时候需要放置分号?

scripting bash

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

用户空间程序应该在哪里保存他们的日志?

我正在编写一个我想在没有特权的情况下运行的脚本。我希望将脚本遇到的错误记录到某个日志文件中。我没有权限给/var/log. 我不想在我的主目录中有一个。

是否有用户空间脚本可以记录运行时信息的位置?在/var/log不产生任何潜在安全问题的情况下获取我的脚本日志信息的最佳做法是什么?我对在脚本上设置 uid / gid 犹豫不决。

scripting logs directory-structure not-root-user

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

将通知发送与 cron 一起使用

我正在使用带有 KDE/Awesome WM 的 Arch Linux。我正在尝试 notify-sendcron.

我试过设置DISPLAY/XAUTHORITY变量,并notify-send使用“sudo -u”运行,但都没有结果。

我能够从会话中以交互方式调用通知发送并获取通知。

FWIW,cron 作业运行良好,我通过将内容回显到临时文件进行了验证。只是“通知发送”不起作用。

代码:

[matrix@morpheus ~]$ crontab -l
* * * * *  /home/matrix/scripts/notify.sh

[matrix@morpheus ~]$ cat /home/matrix/scripts/notify.sh
#!/bin/bash
export DISPLAY=127.0.0.1:0.0
export XAUTHORITY=/home/matrix/.Xauthority
echo "testing cron" >/tmp/crontest
sudo -u matrix /usr/bin/notify-send "hello"
echo "now tested notify-send" >>/tmp/crontest

[matrix@morpheus ~]$ cat /tmp/crontest
testing cron
now tested notify-send

[matrix@morpheus ~]$ 
Run Code Online (Sandbox Code Playgroud)

如您所见,通知发送之前和之后的回声有效。
我也试过设置DISPLAY=:0.0

更新:我搜索了一些,发现需要设置DBUS_SESSION_BUS_ADDRESS。在使用我从交互式会话中获得的值对其进行硬编码后,屏幕上每分钟都会弹出一个小小的“你好”消息!

但问题是这个变量不是永久的,所以我会尝试那里建议的命名管道解决方案。

[matrix@morpheus ~]$ cat scripts/notify.sh
#!/bin/bash …
Run Code Online (Sandbox Code Playgroud)

shell scripting cron libnotify

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

如何在RAM中创建临时文件?

我有一个脚本可以将其输出通过管道传输到|tee scriptnameYYMMDD.txt. 在生成输出的 for 循环的每个循环之后,我将反转文件内容,tac scriptnameYYYYMMDD.txt > /var/www/html/logs/scriptname.txt以便日志输出在浏览器窗口中可见,最新的行位于顶部。

我将有几个脚本并行执行此操作。我正在尝试最小化磁盘活动,因此|tee scriptnameYYYYMMDD.txt最好从RAMdisk输出。mktemp/tmp文件夹中创建一个文件,但它似乎不在磁盘上。

filesystems scripting shell-script tmp files

40
推荐指数
3
解决办法
4万
查看次数

Bash shell 脚本输出对齐

我的脚本:

date
echo -e "${YELLOW}Network check${NC}\n\n"

while read hostname
do

ping -c 1 "$hostname" > /dev/null 2>&1 &&

echo -e "Network $hostname : ${GREEN}Online${NC}" ||
echo -e "${GRAY}Network $hostname${NC} : ${RED}Offline${NC}"

done < list.txt
        sleep 30
clear
done
Run Code Online (Sandbox Code Playgroud)

正在输出这样的信息:

Network 10.x.xx.xxx : Online   
Network 10.x.xx.xxx : Offline   
Network 10.x.xx.xxx : Offline   
Network 10.x.xx.xxx : Offline   
Network 10.x.xx.x : Online   
Network 139.xxx.x.x : Online   
Network 208.xx.xxx.xxx : Online   
Network 193.xxx.xxx.x : Online
Run Code Online (Sandbox Code Playgroud)

我想清理它以获得这样的东西:

Network 10.x.xx.xxx       : Online  
Network 10.x.xx.xxx       : Offline …
Run Code Online (Sandbox Code Playgroud)

scripting shell-script columns text-formatting

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