这是我第一次编写 bash 脚本,所以我可能犯了一个简单的错误。
基本上,我正在尝试编写一个脚本来获取用户的组,如果他们在某个组中,它将相应地记录下来。显然会有更多的功能,但是当我什至无法让正则表达式工作时,构建它是没有意义的!
到目前为止,我有这个:
#!/bin/bash
regex="^([a-zA-Z0-9\-_]+ : [a-zA-Z0-9\-_]+) (usergroup)$"
# example output
groups="username : username usergroup"
echo "$groups" >> /home/jrdn/log
if [[ "$groups" =~ $regex ]]; then
echo "Match!" >> /home/jrdn/log
else
echo "No match" >> /home/jrdn/log
fi
Run Code Online (Sandbox Code Playgroud)
我尝试过该正则表达式的每个地方,它都有效。但是在 bash 脚本中,它只输出$groups, 后跟No match. 那么有人可以告诉我它有什么问题吗?
下面是我用来找出删除sed人名中空格的命令的演示的完整副本,并将其压缩为没有空格。
完成后,我想将它分配给变量,comp然后我可以稍后在脚本中重新使用它。在这里,我只是尝试将echo其发送到标准输出,这样我就可以看到它起作用了。
如果我运行脚本并输入我的名字,Ronald McDonald我得到的结果是RonaldMcDonald}他名字末尾的花括号,或者我输入的任何内容。
我如何让它工作,以便结果不会将 附加}到指定文本的后面。
#!/bin/bash
function readName {
echo "Enter your full name:"
read fullName
clear
} # end readName
function cmprsName {
comp={ echo "$fullName" } | sed 's/ //g'
} # end cmprsName
function sayItNow {
echo $comp
} # end sayItNow
function allTogether {
readName
cmprsName
sayItNow
} #end allTogether
case $1 in
-h | --help ) allTogether
exit
;;
* ) echo …Run Code Online (Sandbox Code Playgroud) 我尝试从.bash_profile. 当我的 shell 脚本运行时添加字符串:
我在 bash_profile 中的字符串如下:
# for Myapllication
export MYAPP_HOME=/opt/myapp
Run Code Online (Sandbox Code Playgroud)
我想从.bash_profile通过rpm.
如何通过shell脚本从文件中删除任何字符串?(或可能的替代方法)
在 bash 脚本中,我想将一些行写入文本文件,但此文件之前已经使用过并且其中有文本。所以我想在其中回显一些额外的文本,从文件中的某个行号开始。
我想要这样的东西:
echo -fromLineNumber 33 -e "anything" >> textPath
Run Code Online (Sandbox Code Playgroud) 我需要.bash_profile与 Dropbox 同步。我能想到的最简单的方法是“重定向”shell 以.bash_profile在自定义文件夹中搜索。
那么这可能吗?或者有什么更好的解决方案?
在了解了在命令行中使用密码的问题后,我需要找到一种方法来为程序提供密码而不会出现问题(密码不会被记录在某处)。
我有一个 bash 脚本,它可以从源代码自动安装整个 LAMP 服务器:Apache、FastCGI、PHP 和 MySQL。这些安装需要密码,尤其是 MySQL。
如何在不泄露密码的情况下使脚本完全自动化?
编辑(UTC 时间 6 月 9 日,3:55):
我在命令行上通过 root 使用密码调用 mysql:
root@dor-desktop:/home/dor# PASS=`cat /home/dor/tmpf/pass`
root@dor-desktop:/home/dor# mysql -u root -p"$PASS"
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 6
Run Code Online (Sandbox Code Playgroud)
(在我们的例子中,PASS="p4ssw0rd")
我ps aux | grep mysql通过我的普通用户(dor)执行,它没有显示密码!
(一些)ps输出是:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 3562 0.0 0.0 34156 2864 pts/0 S+ 05:53 …Run Code Online (Sandbox Code Playgroud) 我知道关于获取进程 ID 有上百万个问题,但这个问题似乎是独一无二的。谷歌没有给我答案,所以我希望 stackexhange 会有所帮助而不是关闭这个问题。
当涉及到 Java 时,查找进程 ID 似乎更棘手(pgrep 不能正常工作)。
此外,我需要在 bash 脚本中自动执行此操作。我遇到的一个问题是,当我使用ps aux | grepgrep 进程本身时,它总是会出现,所以在一个简单的 bash 脚本中处理结果对于我自己找出一个好的解决方案来说不够简单(以我有限的 bash 技能) .
我尝试过的一些事情:
示例 1 - 即使没有该名称的应用程序,它也会返回一个进程:
$ ps aux | grep -i anythingnotreal
user2 3040 0.0 0.0 4640 856 pts/3 S+ 18:17 0:00 grep --color=auto -i anythingnotreal
Run Code Online (Sandbox Code Playgroud)
示例 2 - 即使“java_app”当前正在运行,也不会返回任何内容:
$ pgrep java_app
Run Code Online (Sandbox Code Playgroud)
它什么都不返回。但是,这是“java_app”正在运行的证据:
$ ps aux | grep java_app
tester2 2880 0.7 2.8 733196 58444 ? Sl 18:02 0:07 java -jar /opt/java_app2/my_java_app.jar
tester2 3058 …Run Code Online (Sandbox Code Playgroud) 该sudo -A(SUDO_ASKPASS)选项显然原因sudo来失去的超时时间(例如,timestamp_timeout)设置。
我想使用 sudo -A 选项,但我想在 bash 脚本中保留默认超时(例如,在 Ubuntu 上为 15 分钟)。我想在 GUI 对话框中安全地询问用户密码,但我只想提示一次我的脚本(不是 50 次以上)。
此外,我不想以 root 用户身份运行我的整个脚本,因为我认为这是一个坏主意。此外,在这种情况下,由我的脚本创建的文件具有错误的所有权。
如果保留默认超时,则 sudo -A 选项对我有用。
从 sudo 手册:
选项:?A
通常,如果 sudo 需要密码,它会从用户的终端读取密码。如果指定了 ?A (askpass) 选项,则执行(可能是图形的)帮助程序来读取用户的密码并将密码输出到标准输出。如果设置了 SUDO_ASKPASS 环境变量,它会指定帮助程序的路径。否则,如果 /etc/sudo.conf 包含一行指定 askpass 程序,则将使用该值。例如:
# Path to askpass helper program
Path askpass /usr/X11R6/bin/ssh-askpass
Run Code Online (Sandbox Code Playgroud)
顺便说一句,kdesudo 也有同样的问题——每次调用它都需要密码,即使在同一脚本中只在一秒钟之后。
我正在使用 Kubuntu 12.04 64 位。
这是解决方案所有部分的完整工作示例。它由 bash 脚本、此处建议的“myaskpass”脚本和“.desktop”文件组成。整个事情应该是 100% GUI(根本没有终端交互),所以 .desktop 文件是必不可少的(afaik)。
$ cat myaskpass.sh
#!/bin/bash
kdialog --password "Please enter your password: "
exit 0
$ …Run Code Online (Sandbox Code Playgroud) 这是我尝试制作一个脚本,该脚本将使用“鼠标移动”来防止在观看视频时出现屏幕空白。我希望使用最高 CPU% 进程的值top,如果 CPU 使用率超过 5%,则应发生鼠标移动。
#!/usr/bin/env bash
sleep_period=60s
while true; do
if (( $(top -bn 1 | sed -nrs '8p' | awk '{ print $9 }') -gt 5 )); then
while (( $(top -bn 1 | sed -nrs '8p' | awk '{ print $9 }') -gt 5 )); do
xdotool mousemove 0 100
xdotool mousemove 0 50
sleep ${sleep_period}
done
else
sleep ${sleep_period}
fi
done
Run Code Online (Sandbox Code Playgroud)
不幸的是,它不起作用。错误是这样的:
[07:20 PM] /bin $ noo.sh
/home/vasa1/bin/noo.sh: line 6: ((: 0.0 -gt …Run Code Online (Sandbox Code Playgroud) 我使用反向 ssh 隧道从我的家用 PC 通过我拥有的 Internet 服务器连接到受限客户端(我也拥有)。
我有一个脚本,可以将受限客户端设置为该 ssh 隧道的中间人部分。如果我手动执行脚本,它工作正常。这里是:
#!/bin/sh
autossh -M 12399 -oPubkeyAuthentication=yes -oPasswordAuthentication=no -oLogLevel=error -oUserKnownHostsFile=/dev/null -oStrictHostKeyChecking=no -i ~/.ssh/named_id_rsa -R 12345:localhost:22 client@example.com -p 22
Run Code Online (Sandbox Code Playgroud)
我想让它在这台机器上的网络启动时自动运行。
为了做到这一点,我想把它保存为:/etc/network/if-up.d/reverse_ssh_tunnel.sh
我知道我必须删除“~/”并将私钥的完整路径指定为 home/username/.ssh/named_id_rsa。
我怀疑我必须使用 su -cmy_script_name用户名,但我无法让它工作。解决我的这部分问题是最重要的。它需要全自动且无人值守。
要从我家连接,我执行两个手动步骤:
A. ssh home -> 中间人
B. ssh 中间人 -> 受限客户端
A&B可以一步完成吗?(这很好,但不是必需的。)
总之:
autossh完全自动的受限客户端-> 中间人连接。