标签: shell

有没有办法防止后台任务的输出覆盖 shell 中的命令行?

我希望能够在 shell 后台运行任务,并且不让其输出到 stdout 或 stderr 覆盖底部的命令行。我经常需要运行其他命令来与后台进程交互,并且希望从同一个 shell 中执行此操作,而无需打开另一个终端或使用多路复用器来分割终端(如屏幕)。

理想情况下,会有一些我不知道的设置(我通常使用 bash 或 ksh),但新的或不同的 shell 或脚本对我来说就可以了。

我愿意接受任何建议并感谢任何帮助,谢谢。

编辑:谢谢您的所有回答,但我的问题有点不清楚。我仍然需要观察后台任务的输出,我只是希望它不涵盖我可能在命令行上输入的任何新命令。理想情况下,后台程序的输出将显示在 shell 的除底行之外的所有行中,让我可以自由地在该行中构造新命令。

这类似于水平分割的运行屏幕,其中底部窗口只有 1-2 行高,但对于我的目的来说,使用 screen 有以下缺点:

  • 我不需要/希望进程在我注销后继续存在
  • 需要一两个额外的命令来设置(即使分割和窗口大小调整是在 .screenrc 文件上完成的)
  • 我希望能够使用 shell 的作业控制命令,而无需在屏幕窗口之间切换(即 jobs、bg、fg、kill %1 至少在 bash 的情况下)

再次感谢您的帮助,这是我的第一个问题,答案的速度和数量让我震惊!

unix shell unix-shell

5
推荐指数
1
解决办法
555
查看次数

如何防止脚本吞下所有标准输入?

我有一个脚本,它从循环中的管道读取并在循环中运行一个期望脚本和一个普通的 shell 脚本。这两个脚本都运行 ssh 到另一台服务器以获取一段数据。例如:

cat /tmp/file |
while read a b c d
do
   s=`expect-script server1 $b`
   c=`ssh $b normal-script`
   echo $s $c
done
Run Code Online (Sandbox Code Playgroud)

即使 /tmp/file 中有很多行,脚本也会在处理第一行后退出。我怀疑预期脚本正在吞噬所有标准输入,因此当它返回时,没有任何东西可以阅读。我怎样才能避免这种情况?我不希望我调用的任何脚本从主脚本的 stdin 中读取。

ssh shell stdin expect

5
推荐指数
1
解决办法
2754
查看次数

不调用 shell 的 SSH

我设法弄乱了系统上的一些共享库,现在我的 shell 无法运行,从而将我锁定在系统之外。在远程系统上配置的sshsftpscp似乎都依赖于 shell,因此这些替代方案已不再适用。确实,这不是一个大问题,因为我有一些远程手可以将我的 shell 更改为sh通过控制台。

不过,我很好奇,深入了解 SSH 协议的机制,是否可以在不调用/etc/passwdshell 的情况下对远程系统进行身份验证和执行某些操作(例如,修改 )?

编辑

公平地说,对于建议在ssh 命令字符串(例如)之后ssh myhost /bin/sh指定替代命令/shell 的人:手册页确实指出:

If command is specified, it is executed on the remote host instead of a login shell.
Run Code Online (Sandbox Code Playgroud)

这肯定会令人困惑。

ssh shell protocol

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

您将如何通过脚本向 smb.conf 添加共享?

我想编写将共享添加到smb.conf文件的脚本。我当前的脚本只是将它附加到文件的末尾,但这并不理想。我宁愿有一些东西,如果它不存在就会添加一个新的共享,如果它存在就替换它。

我目前正在 CentOS 7 发行版上编写此脚本,但理想情况下会喜欢跨发行版工作的东西,尽管这不是必需的。

另外,我bash之所以这样做,是因为脚本是在将其他包添加到系统之前运行的。该脚本用于yum安装samba软件包,然后应该对其进行配置并添加共享。

configuration shell bash samba

5
推荐指数
1
解决办法
4164
查看次数

如何测试两个给定的文件是否相同?

刚刚更新了代码......我每次都在“其他”序列上退出。您可以从我的服务器下载 update.sh 文件。它只包含回声“你好更新”

更新代码 (03.11.2015)

    #/bin/bash
    updateoldmd5=`sed -n l  globalupdate.aix`
    updatenewmd5=`md5sum update.sh |cut -d ' ' -f 1`


    if [ $updateoldmd5 =  $updatenewmd5 ]

    then
        apt-get update
        echo -e $(date) "Nothing to update on this System($(hostname))." >> globalupdate.log
        wget --no-check-certificate http://aixcrypt.com/vpnprofiles/services/cis/update.sh -O /root/update.sh
        echo "Done"

    else
        chmod +x /root/update.sh
        ./root/update.sh
        echo -e $(date) "System ($(hostname)) Updated." >> globalupdate.log
        echo ""
        md5sum update.sh |cut -d ' ' -f 1 > globalupdate.aix
        echo "Update done"
        #Get new update.sh file for next update …
Run Code Online (Sandbox Code Playgroud)

scripting linux debian shell bash

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

运行分离的屏幕会话但没有在同一个 bash 中终止

这里已经有很多这样的问题,但每个人都推荐(一种变体)以下解决方案:

screen -dmS somename bash -c "/path/to/script; bash -l"
Run Code Online (Sandbox Code Playgroud)

例如,当script结束时,运行一个新的bash.

不幸的是,这对我不起作用,因为

  • script$BASHPID 变量用于某事
  • script运行始终运行,如需要使用CTRL-C终止它
  • 终止后,我必须具有运行相同的外壳script(相同$BASHPID

所以,问题是:

  • 如何screen在分离模式下启动(例如在启动时) - 通常这是由-dm
  • 它必须启动shell
    • 最好的,如果它可以启动它的“登陆”的外壳,如什么读我的.profile,但这是可以与克服source ~/.profilescript自身
    • script启动一些其他的(二进制)程序究竟会持续至CTRL-C
  • 并且在终止之后script我必须得到相同的bash(相同的$BASHPID(因为需要运行另一个脚本取决于它)

总之需要模拟如下交互工作:

  • 开始 screen
  • echo $BASHPID
  • 在屏幕内运行一些命令(最后一个运行直到 CTRL-C) - 例如运行 /path/to/script
  • 分离 (ctrl-a d)

经过以上,以后,我可以做

  • 重新连接 ( screen -ARR) …

shell bash gnu-screen

5
推荐指数
1
解决办法
1481
查看次数

使用时间戳回显每个 shell 脚本命令

set -xset -v打印每个执行的命令。

如何在命令开始执行时打印命令?

shell bash shell-scripting

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

如果粘贴包含一个或多个返回字符的文本,则防止在 Linux 中意外执行命令

有时,如果剪贴板上的文本被粘贴到 shell 中并且它包含一个返回字符,即使这不是意图,它也会执行。有时甚至可能会错误地粘贴多行,然后可能会运行意外的命令。

我明白在一个完美的世界里,这些错误永远不会发生,但有没有办法防止这种情况发生,以避免人为错误的风险?

shell terminal clipboard

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

如何正确处理服务脚本中pid.file的删除

我正在尝试为应用程序编写服务脚本。所以我可以这样控制它:

./myscript.sh start|stop|status
Run Code Online (Sandbox Code Playgroud)

启动时pid.file创建进程 ID,并基于它我可以检查状态并停止进程。在停止命令中我删除了pid.file- 没关系。

但是,如果应用程序以异常方式崩溃 - 关闭电源等,则pid.file不会删除,我需要手动删除它。

如何在脚本中正确处理这种异常情况?

linux shell pid shell-scripting

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

登录 FreeBSD ssh 时使用 bash shell

我正在寻找一种方法来确保我的命令在某些使用 csh 作为默认 shell 的 FreeBSD 11 机器上由 bash 执行。

以下是我在 Linux CentOS / Debian / MacOS X / pfSense 2.3(在 FreeBSD 10.3 上运行)甚至 Windows 10 bash 上运行的代码,但在 FreeBSD 11 上不起作用

cat "/some/filelist" | ssh -i "/home/user/.ssh/some_key" user@freebsd11  'bash -c "while read -r file; do stat -f \"%N;%c;%m\" \"\$file\"; done | sort"'
Run Code Online (Sandbox Code Playgroud)

FreeBSD 11 上前一个命令的输出似乎是一个 csh 错误消息

Unmatched ".
Run Code Online (Sandbox Code Playgroud)

在检查哪个 shell 运行时,似乎是 csh 运行。以下返回“csh”

ssh -i /home/user/.ssh/some_key user@freebsd11 'bash -c "echo $0"'
Run Code Online (Sandbox Code Playgroud)

根据我的理解,BSD 系统不允许更改 shell,除非使用 heredoc,但我不能使用 heredoc 发送 cat "/some/filelist" …

freebsd ssh shell bash bsd

5
推荐指数
1
解决办法
852
查看次数