标签: bash

在安装脚本中检测失败

我写了一个安装脚本来安装我喜欢的程序和设置后我得到一个新的服务器。

apt-get install git
git clone http://me@myvimsetting.github.com .vim
ln -s .vimrc .vim/vimrc
...
Run Code Online (Sandbox Code Playgroud)

但是,如果在安装过程中发生错误,我该如何中断安装脚本并记录错误?例如,如果github服务器宕机,创建一个指向不存在的vimrc.

(或者您有更好的方法来初始化服务器?)

bash shell-scripting

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

通过 USB 连接设备时执行命令

我目前有一个系统可以将我的 Linux 服务器备份到/media/usb. 这一切正常。但是,我实际上有 2 个驱动器,我们尝试每天更换它们。

例如,如果插入 USB 设备并使用sendmail某种方式或类似的方式向管理员发送电子邮件(例如,如果驱动器已超过 3 天未更换)是否有任何记录?

automation linux backup bash udev

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

bash 变量用单引号扩展的问题

我有一个像这样构建的变量:

ATTSTR=""
for file in $LOCALDIR/*.pdf
do
  ATTSTR="${ATTSTR} -a \"${file}\""
done
Run Code Online (Sandbox Code Playgroud)

变量现在包含(注意文件名中的空格):

ATTSTR=' -a "/tmp/Testpage - PDFCreator.pdf"'
Run Code Online (Sandbox Code Playgroud)

现在我想在这样的命令中使用这个变量:

mutt -s "Subject" "${ATTSTR}" recipient@example.ec
Run Code Online (Sandbox Code Playgroud)

但事实证明它像这样扩展,因此命令失败(注意扩展变量周围添加的单引号):

mutt -s "Subject" ' -a "/tmp/Testpage - PDFCreator.pdf"' recipient@example.ec
Run Code Online (Sandbox Code Playgroud)

我希望我的变量在没有单引号的情况下扩展,使用"$ATTSTR"$ATTSTR只是更糟。我怎样才能做到这一点?

scripting linux bash

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

Chrooted 用户不在他的主目录中启动并且不加载他的 bash_profiles

如果用户登录,他会从 chroot 的 / 开始(在真机上是 /var/jail)。我希望他从他的家庭目录开始。此外,他似乎没有加载任何他的个人资料文件(.bash.rc 等)。我按照教程创建了 chroot 环境。这是我的 /etc/passwd 的样子:

test:x:1004:1008:,,,:/var/jail/home/test:/bin/bash
Run Code Online (Sandbox Code Playgroud)

这是我的 /var/jail/etc/passwd 文件的样子:

test:x:1004:1008:,,,:/home/test:/bin/bash
Run Code Online (Sandbox Code Playgroud)

我还发现,如果我删除

Match User test
    ChrootDirectory /var/jail
    AllowTCPForwarding no
    X11Forwarding no
Run Code Online (Sandbox Code Playgroud)

从我的 /etc/ssh/sshd_config 中,用户从他正确的主文件夹中开始,并加载了他的 bash 设置。但是,如果我删除该部分,他就可以离开 chroot 环境。我之前问过的这个问题有些相关,因为我认为命令行的错误外观是由未加载的配置文件引起的。那么任何想法如何解决这个问题?

linux ssh bash chroot

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

在所有文件夹上运行 chown 并将所有者设置为文件夹名称减去尾随 / 的脚本

一些麻木跑了chown -R username。在我们的网络服务器上的 /home 文件夹中,认为他在所需的文件夹中。毋庸置疑,服务器正在抛出很多问题。

我们有 200 多个网站,我不想将它们全部单独列出,因此我正在尝试制作一个脚本,将所有文件夹的所有者更改为文件夹名称,不带尾随 /。

到目前为止,这就是我所拥有的一切,一旦我可以删除 / 就可以了,但我还想检查文件是否包含 . 在其中,如果没有,则运行该命令,否则转到下一个。

#!/bin/bash
for f in *

do

    test=$f;
    #manipluate the test variable
    chown -R $test $f

done
Run Code Online (Sandbox Code Playgroud)

任何帮助都会很棒!

提前致谢!

linux ssh shell bash

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

在检查函数的退出状态和抑制输出时使用 shell 内置时间

我正在尝试在 bash 脚本中执行以下操作,并且想知道是否有可能:

  • 使用 time
  • 抑制命令的 stdout 输出
  • 在出现错误时捕获命令的 stderr 输出
  • 运行后查看命令的退出状态码

这是一个复杂的链,我没有太多运气让它一起工作。如果我停止使用时间,我可以获得状态代码。

这是我到目前为止所拥有的:

# the setup
TIMEFORMAT=%R
MYSQL=mysql <options>

# execute and time a query (does more than is listed here)
function executeQuery {

  TIME=$( time ( $MYSQL "$1" 2>&1 | tee /tmp/somefile.txt > /dev/null ) 2>&1 )

  # do something with $?

}
Run Code Online (Sandbox Code Playgroud)

我正在使用 tee 将命令中的任何错误响应重定向到文件,然后将生成的 stdout 发送到 /dev/null。然后我将时间命令的 stderr 重定向到 stdout,它应该以 $TIME 结束。

现在,如果我将该行更改为:

  TIME=$( time ( $MYSQL "$1" 2>&1 | tee /tmp/somefile.txt > /dev/null; exit ${PIPESTATUS[0]} …
Run Code Online (Sandbox Code Playgroud)

bash time

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

Linux命令查找和删除某些文件,但输出结果或详细模式?

所以我在我的存储服务器上使用这些命令来清理一些垃圾,但它不会产生任何输出或结果。我在网上找到了语法,只是修改了我需要的文件。我还需要添加什么才能查看最后实际删除或总计的内容?最终这将是一个自动运行的脚本,但现在我正在手动运行命令。提前致谢!

find . -name .DS_Store -printf \"%p\"\ \  | xargs rm 
find . -name ._.DS_Store -printf \"%p\"\ \  | xargs rm 
find . -name Thumbs.db -printf \"%p\"\ \  | xargs rm
find . -name ._Thumbs.db -printf \"%p\"\ \  | xargs rm
Run Code Online (Sandbox Code Playgroud)

scripting linux bash

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

为什么这个命令不能作为 cronjob 工作,而在 shell 中输入时却能完美运行?

如果我从 shell 运行此命令,它会按预期工作:

cd ~ && mysqldump --databases --skip-dump-date --host=localhost --user=admin --password=xxxxx --lock-all-tables --result-file=xxxxx_dump_tmp.sql mydb && gzip xxxxx_dump_tmp.sql && mv xxxxx_dump_tmp.sql.gz xxxxx_dump_`date +"%Y-%m-%d__%H.%M.%S"`.sql.gz
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用完全相同的命令(复制粘贴)设置 cronjob,它会失败并显示以下错误(我通过电子邮件收到通知):

/bin/sh: -c: line 0: unexpected EOF while looking for matching ``'
/bin/sh: -c: line 1: syntax error: unexpected end of file
Run Code Online (Sandbox Code Playgroud)

怎么了?

bash cron

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

我如何在 exec 内查找执行中使用 {} 运算符

我试过这个 bash 命令:

find /var/www/ -path '*wp-admin/index.php' -exec mv {} $(dirname {})/index_disabled
Run Code Online (Sandbox Code Playgroud)

但是第二个{}没有执行。

结果只是./index_disabled相反。

如何在执行命令中两次使用找到的参数?

bash find search-and-replace

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

如何在整个系统 (Linux) 中搜索特定字符串?

我需要找到这个字符串:

7z a -p
Run Code Online (Sandbox Code Playgroud)

我试过了:

grep -iR "7z a -p" /

但它似乎在一段时间后挂起,有很多:

grep: /sys/class/vc/vcs5/power/autosuspend_delay_ms: Input/output error
grep: warning: /sys/class/vc/vcsa5/subsystem: recursive directory loop
grep: /sys/class/vc/vcsa5/power/autosuspend_delay_ms: Input/output error
grep: warning: /sys/class/vc/vcs6/subsystem: recursive directory loop
Run Code Online (Sandbox Code Playgroud)

编辑 - 但是,这似乎只是查看静态文本文件。另外,运行时区、内存和进程呢?即整个系统?例如对于 mysql:

ps aux | grep "mysql -u user -p"
Run Code Online (Sandbox Code Playgroud)

显示:

38164  4292 pts/0    S+   13:16   0:00 mysql -uodbcuser -px xxxxxxxx
Run Code Online (Sandbox Code Playgroud)

有趣的是 ps aux 确实隐藏了 xxxxx 的密码。我可以尝试使用 7zip,但它非常快,它必须在您运行 ps aux 命令以“捕获它”的同时运行。

linux bash

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