标签: bash

从 bash 脚本检测 Ubuntu 键盘

请原谅我对 linux 操作系统/硬件问题的无知......我只是一个程序员 :)

我有一个应用程序调用一些 bash 脚本来启动外部应用程序,在这种情况下是 Firefox。该应用程序在具有触摸屏功能的信息亭上运行。在启动 Firefox 时,我还启动了一个允许用户进行键盘输入的虚拟键盘应用程序。

然而,信息亭还具有 PS/2 和 USB 插槽,允许用户插入键盘。如果插入了键盘,如果我不必启动虚拟键盘并为 Firefox 窗口提供更多屏幕空间,那就太好了。

有没有办法让我检测键盘是否从 bash 脚本插入?它会出现在 /dev 中,如果是,它会出现在一致的位置吗?如果用户使用 PS/2 或 USB 键盘会有所不同吗?

谢谢!

ubuntu bash keyboard

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

(svn+ssh) 让 bash 通过 SSH 加载我的路径

我试图svnserve通过 SSH 在服务器上提供(Subversion 服务器)时出现了这个问题。我编译了 SVN 并将其安装在$HOME/bin. 本地访问它(不是通过 SSH)工作正常。

svn+ssh由于以下原因连接失败:

bash: svnserve: command not found
Run Code Online (Sandbox Code Playgroud)

调试这个,我发现:

ssh user@server "which svnserve"
Run Code Online (Sandbox Code Playgroud)

说:

which: no svnserve in (/usr/bin:/bin)
Run Code Online (Sandbox Code Playgroud)

这就奇怪了,因为我已经更新的路径,$HOME/bin在我.bashrc,和还增加了它~/.ssh/environment。但是,SSH 似乎没有读取它。虽然当我跑步时:

ssh user@server "echo $PATH"
Run Code Online (Sandbox Code Playgroud)

确实打印了我更新的路径!

这里发生了什么?如何让 SSH 找到我的svnserve? 提前致谢

ssh bash svn

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

`ssh foo "<command/>"` 没有加载远程别名?

总结:为什么会失败

$ ssh foo 'R --version | head -n 1'
bash: R: command not found
Run Code Online (Sandbox Code Playgroud)

但这成功了

$ ssh foo 'grep -nHe 'bashrc' ~/.bash_profile'
/home/me/.bash_profile:3:# source the users .bashrc if it exists
/home/me/.bash_profile:4:if [ -f "${HOME}/.bashrc" ] ; then
/home/me/.bash_profile:5:  source "${HOME}/.bashrc"
$ ssh foo 'grep -nHe "\WR\W" ~/.bashrc'
/home/me/.bashrc:118:alias R='/share/linux86_64/bin/R'
$ ssh foo '/share/linux86_64/bin/R --version | head -n 1'
R version 2.14.1 (2011-12-22)
Run Code Online (Sandbox Code Playgroud)

? 细节:

我是 2 个集群的(无根)用户。一个使用环境模块,因此该集群上的任何给定服务器都可以(通过module add)提供几乎相同的资源。不幸的是,我也必须在另一个集群上工作,它有单独管理的服务器,所以我养成了这样做的习惯,例如,

EXEC_NAME='whatever'
for S in 'foo' 'bar' 'baz' ; do …
Run Code Online (Sandbox Code Playgroud)

linux ssh bash bashrc login-script

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

如何并行化scp命令?

我需要从SCP的文件machineB,并machineCmachineA。我正在从machineA. 我已经正确设置了 ssh 密钥。

如果文件不存在的machineB,那么它应该是那里machineC。我需要将所有 PARTITION1 和 PARTITION2 文件移动到 machineA 各自的文件夹中,如下所示在我的 shell 脚本中 -

#!/bin/bash

readonly PRIMARY=/export/home/david/dist/primary
readonly SECONDARY=/export/home/david/dist/secondary
readonly FILERS_LOCATION=(machineB machineC)
readonly MAPPED_LOCATION=/bat/data/snapshot
PARTITION1=(0 3 5 7 9)
PARTITION2=(1 2 4 6 8)

dir1=$(ssh -o "StrictHostKeyChecking no" david@${FILERS_LOCATION[0]} ls -dt1 "$MAPPED_LOCATION"/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] | head -n1)
dir2=$(ssh -o "StrictHostKeyChecking no" david@${FILERS_LOCATION[1]} ls -dt1 "$MAPPED_LOCATION"/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] | head -n1)

length1=$(ssh -o "StrictHostKeyChecking no" david@${FILERS_LOCATION[0]} "ls '$dir1' | wc -l")
length2=$(ssh -o …
Run Code Online (Sandbox Code Playgroud)

linux ubuntu shell bash scp

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

比 curl 更快的 ping URL 方法

检查指定 URL 是否有效的最快方法是什么?(以 OK http 状态代码响应)?

现在我正在使用 curl,但我有一堆 URL 需要循环测试,所以我正在寻找最快的解决方案。

除了 wget 之外还有其他选项要检查吗?

debian url bash ping curl

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

ssh 远程命令执行引用

我发现这个解决方案对我有用,但我不明白它是如何工作的,因为 sed 命令将其自己的参数用单引号括起来,并且整个 ssh 命令也用单引号传递。这是从 OSX (bsd) 运行的。

ssh -t -p 22 root@thehost 'for user in $(/bin/ls -A1 /var/cpanel/users) ; do if grep -q RS=paper /var/cpanel/users/${user}; then sed -i 's/^RS=paper_lantern$/RS=x3/' /var/cpanel/users/${user}; fi; done'
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释为什么这样做,以及为什么我不需要转义 sed 命令的单引号 - 我在任何地方都找不到参考?谢谢。

ssh bash sed

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

运行分离的屏幕会话但没有在同一个 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
查看次数

Bash 命令在终端运行,但不在 Jenkins/Bash 脚本中运行

我正在使用 Jenkins 构建 HTML 文档并将其部署到本地 Apache Web 服务器以供我们的开发人员使用。当我在终端中运行命令时,一切都安装正确(证明服务器设置正确)。但是,当从 Jenkins 内部运行相同的命令时,它们会被调用但没有任何变化。它不会删除html.zip(第 18 行),不会将文件移动到 中/var/html/www/subdir,并且不会报告curl请求失败之外的任何错误。我对我做错了什么有点迷茫。

我应该注意,我将整个脚本称为sudo. 我知道这是不安全的,但我想我会先尝试让脚本工作,然后再更改。为了确保user在安装文档时不会遇到问题,我暂时允许它以 sudo 身份运行任何命令而无需密码。同样,我知道这是不安全的,但本着试图消除变量的精神,我添加了这个。

Jenkins 像这样调用这个脚本: sudo ./documentation-publisher.sh

目前对脚本的权限限制最少,777。调用ls -l脚本报告: -rwxrwxrwx 1 devop developers 1144 Dec 3 10:29 documentation-publisher.sh

我尝试了这篇文章中关于在脚本中显式设置路径的建议,但没有发现任何差异。使用的每个命令的显式路径也不会改变行为。

#!/bin/sh -x

echo "Archiving generated HTML for transfer..."
cd Example/docs/html/
zip -r html.zip ./
scp -i ~/.ssh/id_rsa html.zip user@my.host.example.com:/home/user 
ssh -i ~/.ssh/id_rsa user@my.host.example.com 

echo "Extracting generated HTML into www directory..."
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
unzip -o …
Run Code Online (Sandbox Code Playgroud)

scripting bash web-server documentation jenkins

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

奇怪的行为 ssh -> bash --> (tty no echo) --> c 程序?

在工作中,我们有一个旧的 C 程序,它与霍尼韦尔的工业手持终端一起工作。

该终端有自己的 ssh 客户端来连接到 linux redhat 6.6 服务器。一旦它连接到 linux box(使用某个用户),bash shell 就会启动一个 C 程序,并带有以下参数

export TERM=vt200
stty raw icrnl -echo
$APLI_EXEC/program param1 param2
Run Code Online (Sandbox Code Playgroud)

所以流程就像 => 客户端 ssh --> ssh 服务器-> bash --> c 程序

应用程序(或看起来)运行良好,但有时(每周 1-3-5 次)随机终端停止从服务器接收数据,但应用程序接收来自服务器的输入。就像在 shell 中编写 Ctrl+S 一样。

使用 strace 调试应用程序和 ssh 进程时,我意识到一些奇怪的事情:

应用程序 strace 很好

write(1, "1", 7) = 1
Run Code Online (Sandbox Code Playgroud)

但是 ssh 过程的 strace 不好(我认为..是的,我看到 ioctl 没有 echo 参数,但是...)

rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
read(3, "\227\316\242\350\261\330)\300e\210\352\367\2VX\24\305\2474\272\371\34\273n{\323p.\211\17H\327"..., 16384) …
Run Code Online (Sandbox Code Playgroud)

debug ssh bash

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