标签: bash-script

bash脚本中的正则表达式

这是我第一次编写 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. 那么有人可以告诉我它有什么问题吗?

scripting bash regular-expression bash-script

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

如何将sed的结果分配给变量

下面是我用来找出删除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 sed shell-script environment-variables bash-script

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

如何通过shell脚本从文件中删除任何字符串?

我尝试从.bash_profile. 当我的 shell 脚本运行时添加字符串:

我在 bash_profile 中的字符串如下:

# for Myapllication
export MYAPP_HOME=/opt/myapp
Run Code Online (Sandbox Code Playgroud)

我想从.bash_profile通过rpm.

如何通过shell脚本从文件中删除任何字符串?(或可能的替代方法)

linux shell-script bash-script

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

从文本文件中的某个行号开始写入

在 bash 脚本中,我想将一些行写入文本文件,但此文件之前已经使用过并且其中有文本。所以我想在其中回显一些额外的文本,从文件中的某个行号开始。

我想要这样的东西:

echo -fromLineNumber 33 -e "anything" >> textPath
Run Code Online (Sandbox Code Playgroud)

bash bash-script

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

我如何将 .bash_profile 搬离家

我需要.bash_profile与 Dropbox 同步。我能想到的最简单的方法是“重定向”shell 以.bash_profile在自定义文件夹中搜索。

那么这可能吗?或者有什么更好的解决方案?

bash bash-script

9
推荐指数
1
解决办法
1954
查看次数

使用密码安全地提供程序

在了解了在命令行中使用密码的问题后,我需要找到一种方法来为程序提供密码而不会出现问题(密码不会被记录在某处)。

我有一个 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)

security password bash-script

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

在bash脚本中查找java应用的进程id(查看目标应用是否已经在运行)

我知道关于获取进程 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)

bash java shell-script process-management bash-script

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

在 bash 脚本中以图形方式询问密码并保留默认的 sudo 超时设置

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)

bash password gui sudo bash-script

9
推荐指数
1
解决办法
8651
查看次数

使用“鼠标移动”防止屏幕消隐的脚本不起作用

这是我尝试制作一个脚本,该脚本将使用“鼠标移动”来防止在观看视频时出现屏幕空白。我希望使用最高 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)

bash-script

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

网络启动时自动启动 autossh 反向隧道

我使用反向 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可以一步完成吗?(这很好,但不是必需的。)

总之:

  1. 理想情况下,我想手动一步完成 A 和 B。
  2. 而且我需要autossh完全自动的受限客户端-> 中间人连接。

ssh ssh-tunneling bash-script

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