小编Dmi*_*ank的帖子

创建反向隧道的永久后台 ssh 连接:正确的方法是什么?

相关问题:启动服务器到客户端的ssh连接

那里的回答对我帮助很大,这个命令可以满足我的需求:

ssh -R 2225:localhost:22 loginOfServerWithPublicIP@publicIP
Run Code Online (Sandbox Code Playgroud)

所以我写了脚本来一直重新连接:

 #!/bin/bash

 while true; do
    echo "try to connect..."
    ssh -o ServerAliveInterval=240 -R 2225:localhost:22 user@host
    echo "restarting in 5 seconds.."
    sleep 5
 done
Run Code Online (Sandbox Code Playgroud)

并将其添加到/etc/crontab. 但是我发现如果我只从 shell 中“手动”执行它,它就可以工作,但是如果它被 cron 调用,ssh 会连接并立即完成。(所以,上面的脚本一直重新连接)

man ssh,我发现对于后台连接,我应该用-n密钥调用它,但它没有帮助。然后,我只是环顾四周寻找类似的脚本,我发现如果我调用它就可以工作tail -f something,即一些“永无止境”的命令,所以我刚刚创建了一个空文件/tmp/dummy_file,现在我的 ssh 命令如下所示:

ssh -o ServerAliveInterval=240 -R 2225:localhost:22 -n user@host tail -f /tmp/dummy_file
Run Code Online (Sandbox Code Playgroud)

它现在有效!但是,这个解决方案似乎有点难看,而且我真的不明白这种行为的实际原因。碰巧,我试图调用bash而不是tail -fbash在我看来也是“永无止境”的命令),但它不起作用。

那么,任何人都可以解释这种行为,以及创建后台 ssh 连接以保持反向 ssh 隧道的正确方法是什么?

ssh background-process

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

连接关闭时如何远程终止称为“tail -f”?

我只是注意到,如果我执行ssh user@remote_host tail -f /some/filetail -f /some/file即使 ssh 连接关闭,它也会继续在 remote_host 上运行!

因此,经过多次连接和断开连接后,运行的次数会tail -f /some/file增加。tail -fssh 连接关闭时如何实际终止?

process ssh terminal signals

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

zsh:在 tmux 中设置 TERM=screen-256color,但在没有 tmux 的情况下设置 xterm-256color

我需要我的$TERMxterm-256colorTMUX以外(在“普通”与zsh的终端),但screen-256color里面TMUX。

首先我试过:

  • 添加export TERM='xterm-256color'到我的~/.zshrc.
  • 添加set -g default-terminal "screen-256color"到我的~/.tmux.conf

现在,当我打开终端(比如 xterm)时,TERMxterm-256color,这是正确的。但是当我运行 tmux 时,又TERMxterm-256color

然后我尝试在我的~/.zshrc. 现在,当我打开终端时,TERMxterm,而当我运行 tmux 时,TERMscreen-256color。如此看来,如果我设置TERM.zshrc,首先TMUX套TERMscreen-256color,运行外壳(这是zsh的),和zsh的读取.zshrc和复位TERMxterm-256color

那么,如何让TERMxterm-256color在“普通”终端,并screen-256color在TMUX?

zsh tmux xterm

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

如何从 lsusb 输出或通过设备路径获取设备文件名

相关问题:USB 连接/断开通知

当设备插入/拔出时,我会收到即时通知,这很棒。但是为了使它(几乎)完美,我还想获得像 一样的设备文件名/dev/ttyUSB0,甚至更好的是,它的所有符号链接。

但是,我无法找到如何从udev、 或 从lsusb或以其他方式获取此信息。我拥有的设备的唯一 ID 是像/devices/pci0000:00/0000:00:1d.0/usb5/5-1. 如何从中获取设备文件名?

linux usb udev devices

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

从 udev 规则调用通知发送

我使用 Linux Mint 13 MATE,并且在插入/拔出设备时尝试设置通知。

首先,我找到了udev-notify包,但不幸的是它几乎对我不起作用:它工作的时间很短(1-2 分钟),然后,如果我连接/断开任何设备,它会崩溃:

Traceback (most recent call last):
  File "./udev-notify.py", line 319, in <module>
    notification.show()
glib.GError: GDBus.Error:org.freedesktop.DBus.Error.ServiceUnknown: The name :1.1061 was not provided by any .service files
Run Code Online (Sandbox Code Playgroud)

我还没有找到任何解决方案,所以我不得不将其删除。(日提交错误报告也)

令人惊讶的是,到目前为止我还没有找到类似的实用程序。然后我尝试编写应该匹配所有设备的 udev 规则。我添加了新文件/etc/udev/rules.d/notify.rules

ACTION=="add",    RUN+="/bin/bash /home/dimon/tmp/device_plug.sh"
ACTION=="remove", RUN+="/bin/bash /home/dimon/tmp/device_unplug.sh"
Run Code Online (Sandbox Code Playgroud)

和两个脚本:

device_plug.sh:

#!/bin/bash

export DISPLAY=":0"
notify-send "device plugged"

/usr/bin/play -q /path/to/plug_sound.wav &
Run Code Online (Sandbox Code Playgroud)

device_unplug.sh:

#!/bin/bash

export DISPLAY=":0"
notify-send "device unplugged"

/usr/bin/play -q /path/to/unplug_sound.wav &
Run Code Online (Sandbox Code Playgroud)

它有效,但它的工作非常愚蠢。我的问题是:

  1. 如何获取附加设备的实际标题,与我在lsusb输出中看到的相同?目前,我只收到诸如“已插入”和“未插入”之类的通知,但我找不到如何在我的 udev 规则中检索设备名称(如果可以,我会将它作为范围)
  2. 目前,激活的通知太多。比如说,当我连接 U 盘时,我收到了大约 15 …

udev notifications devices notify-send

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

通过主要/次要编号对获取设备节点

下的每个设备节点/dev都有自己的主要/次要编号对。我知道我们可以通过 的方式从设备节点检索这对数字stat,如下所示:

stat -c 'major: %t minor: %T' <file>
Run Code Online (Sandbox Code Playgroud)

或者,ls -l也显示这些数字。

但是我们如何通过给定的主要和次要编号获得设备节点?我知道的唯一方法是某种ls -l+awk技巧,但我真的希望有更好的解决方案。

udev

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

启动从服务器到客户端的 ssh 连接

我们可以通过以下方式轻松连接 ssh到具有公共 IP 的远程机器。

但是现在我有一台没有公共 IP 的远程机器,我需要从我有公共 IP 的机器连接到它。这样,远程机器应该启动这个连接(添加一个客户端)。

我需要它,因为我的祖父在没有公共 IP 的计算机上,有时他的系统需要帮助。

在 Windows 上的类似情况下,我使用了 VNC 连接(通过 TightVNC),TightVNC 服务器有一个选项“添加客户端”:用户刚刚输入了客户端的 IP(即我的公共 IP),我的客户端已经处于“侦听模式”,并且当“服务器”添加一个客户端时,连接被初始化。

那么,是否可以通过 SSH 连接执行相同的技巧?

ssh ssh-tunneling

11
推荐指数
1
解决办法
8071
查看次数

虚拟 USB HID 设备

我正在开发一个将与连接的 USB HID 设备进行通信的应用程序。问题是还没有真正的设备(它正在由我们团队的另一部分开发),所以,我真的很想有一些方法来模拟它。

我能想到的理想实用程序应该是这样的:一个内核模块,当加载时,它会在系统中创建两个设备节点:

  • 一个虚拟的 usb-hid 设备,它可能与任何真正的 usb-hid 设备节点没有区别/dev/hidraw0;当然,这个设备应该被我使用的任何 usb-hid 库看到,例如,hidapi.
  • 一个服务设备节点,如/dev/virtual_hid_1

因此,当任何人写入 时/dev/virtual_hid_1,这些数据应该从字面上读取/dev/hidraw0,反之亦然。

通过这种方式,我可以用我想要的任何语言编写一些调试应用程序,无论是python什么;它应该只是写入和读取/dev/virtual_hid_1. 开发起来会很方便。

有这样的吗?

virtual-machine usb hid

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

将物理 USB 设备路径映射到 lsusb 返回的总线/设备编号

我需要获取所连接 USB 设备的标题。我可以用lsusb.

udev 允许在我编写规则时进行一些替换:比如说,我们可以使用$kernel来获取设备的名称,或$devpath获取设备的路径。

但问题是lsusb返回这样的字符串:

Bus 005 Device 032: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC
Run Code Online (Sandbox Code Playgroud)

但是 udev 的 devpath 是:

/devices/pci0000:00/0000:00:1d.0/usb5/5-2 
Run Code Online (Sandbox Code Playgroud)

总线编号相同(5),但编号不同:Device 032似乎是某个逻辑编号(当我重新连接设备时,此编号会增加),并且2似乎是物理设备编号。

所以 udev 返回物理编号,我需要获取逻辑编号。然后,我可以检索这样的数据:lsusb -D /dev/bus/usb/005/032

那么,如何032通过物理路径获取逻辑设备号,例如/devices/pci0000:00/0000:00:1d.0/usb5/5-2

usb udev devices

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

如何获取所有活动 X 会话及其所有者的列表

我正在实施 USB 插入/拔出通知(这里是相关问题),我需要执行类似notify-send "device plugged" "My Device Title". 问题是要使此命令起作用,我应该首先设置DISPLAY,如下所示:

export DISPLAY=":0.0"
Run Code Online (Sandbox Code Playgroud)

其次,该命令应该由适当的用户调用。说,对于用户dimon

su dimon -c "notify-send 'device plugged' 'My Device Title'"
Run Code Online (Sandbox Code Playgroud)

因此,我需要获取所有活动 X 会话和适当用户的列表,并notify-send在他的DISPLAY.

我尝试为此使用wLinux Mint 13 MATE 的示例输出:

USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
dimon    tty8     :0               Sun15    3days  1:38m  1.95s x-session-manager
dimon    pts/0    :0               Sun15    0.00s  0.20s  0.00s tmux
Run Code Online (Sandbox Code Playgroud)

所以我们有用户名和显示。我决定这样解析它:

declare -a logged_users=(`w |grep -vP "^(USER| )" |awk '{if (NF==8){print $1" "$3} …
Run Code Online (Sandbox Code Playgroud)

linux x11 session

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

Linux 内核手动构建:生成的二进制文件比预编译的二进制文件大 10 倍

我正在使用 Linux Mint 13 MATE 32 位,我正在尝试构建内核(主要是为了体验和乐趣)。

现在,我喜欢使用与预编译内核相同的配置来构建它,所以首先我从kernel.ubuntu.com安装了预编译内核3.16.0-031600rc6,并成功引导到它。

然后我从kernel.org下载了 3.16.rc6 内核,解压它,将其配置为使用来自现有预编译内核的配置:

$ make oldconfig
Run Code Online (Sandbox Code Playgroud)

它没有问我任何问题,因此,预编译的内核包含所有必要的信息。然后我构建了它(大约花了 6 个小时):

$ make
Run Code Online (Sandbox Code Playgroud)

然后安装:

$ sudo make modules_install install
Run Code Online (Sandbox Code Playgroud)

然后我启动到我手动编译的内核,它可以工作,但启动过程有点慢。但是后来我发现所有的二进制文件(/boot/initrd.img-3.16.0-rc6以及其中的所有*.ko模块/lib/modules/3.16.0-rc6/kernel都比预编译版本大 10 倍左右!说,initrd.img-3.16.0-rc6160 658 665字节,但预编译initrd.img-3.16.0-031600rc6-generic16 819 611字节。每个*.ko模块都同样大。

为什么是这样?我没有为构建指定任何特殊选项(我输入的命令与我上面提到的完全相同)。如何“正确”构建它?

linux compiling linux-kernel

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

广播消息不会出现在 gnome-terminal 上,但会出现在 xterm 上

我对广播消息的行为很好奇

$ sudo wall myfile
Run Code Online (Sandbox Code Playgroud)

来自的消息myfile出现在所有/dev/ttyN设备上(我可以通过按Ctrl+ Alt+切换到的设备fN),它也出现在xterm我打开的窗口上,但没有出现gnome-terminal(实际上我使用 Linux Mint 和 MATE,所以它mate-terminal,但它是分叉的gnome-terminal)。

如果我在tmux中运行,还有一个有趣的注意事项xterm:我预计该消息会出现在所有正在运行的终端会话上tmux(在所有窗口和每个窗口的每个窗格中),但实际上该消息仅出现在当前光标位置该xterm窗口。

如果我通过调用检查当前控制终端tty,它会报告 tmux 中不同窗口的不同终端:比如说,我/dev/pts/11在一个 tmux 窗口和/dev/pts/12另一个窗口中都有。但是,对于每个xterm窗口,广播消息只出现一次,而不是在tmux.

在我看来,该终端仿真器,当分配伪终端,需求一样,“注册”它的地方,使其能够接收广播消息,所以,xterm这样做,但mate-terminaltmux没有。但这听起来很奇怪,因为伪终端是由内核分配的,因此,它应该在需要的任何地方自动“注册”。

如果有人解释它是如何工作的以及为什么会这样(看起来很奇怪),我会很高兴。

terminal broadcast

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

tmux:ncurses 应用程序显示错误(带有垃圾等)

我有 ncurses 应用程序(比如 aptitude)在普通 xterm(或 gnome-terminal,或我尝试过的任何其他终端)中运行良好,但是如果我在 tmux 会话中运行它,屏幕在我做一些导航时没有正确刷新通过菜单。

示例截图: aptitude qinside tmux

(完整分辨率:http : //i.imgur.com/jKLCX3A.png

tmux 中的其他 ncurses 应用程序也会发生同样的情况:例如,cgdb。再一次,没有 tmux 他们工作得很好。

如何让它在 tmux 中也能正常工作?

(操作系统是 Linux Mint 13,如果这很重要的话)

terminal tmux ncurses

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