前言:我喜欢 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 代码调用二进制文件。
这样的壳存在吗?
我没有做足够的脚本来记住,不查找,双引号或单引号是否会导致 Unix 变量被替换。
我绝对明白发生了什么。我的问题是有没有人有记忆技巧可以让正确的引用规则留在我的脑海中?
我想默默地,非交互地,创建一个 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) 有时我会重新启动设备,并需要ssh在设备准备就绪后重新启动。
我想每 5 秒运行一次 ssh 命令,直到命令成功。
我的第一次尝试:
watch -n5 ssh me@device.local && exit 1
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
我正在尝试学习如何使用 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) 为什么把分号放在一个而不是另一个?
结果是一样的
代码一
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)
第二个代码中的分号是不必要的吗?
什么时候需要放置分号?
我正在编写一个我想在没有特权的情况下运行的脚本。我希望将脚本遇到的错误记录到某个日志文件中。我没有权限给/var/log. 我不想在我的主目录中有一个。
是否有用户空间脚本可以记录运行时信息的位置?在/var/log不产生任何潜在安全问题的情况下获取我的脚本日志信息的最佳做法是什么?我对在脚本上设置 uid / gid 犹豫不决。
我正在使用带有 KDE/Awesome WM 的 Arch Linux。我正在尝试
notify-send与cron.
我试过设置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) 我有一个脚本可以将其输出通过管道传输到|tee scriptnameYYMMDD.txt. 在生成输出的 for 循环的每个循环之后,我将反转文件内容,tac scriptnameYYYYMMDD.txt > /var/www/html/logs/scriptname.txt以便日志输出在浏览器窗口中可见,最新的行位于顶部。
我将有几个脚本并行执行此操作。我正在尝试最小化磁盘活动,因此|tee scriptnameYYYYMMDD.txt最好从RAMdisk输出。mktemp在/tmp文件夹中创建一个文件,但它似乎不在磁盘上。
我的脚本:
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)