相关问题:启动服务器到客户端的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 -f
(bash
在我看来也是“永无止境”的命令),但它不起作用。
那么,任何人都可以解释这种行为,以及创建后台 ssh 连接以保持反向 ssh 隧道的正确方法是什么?
我只是注意到,如果我执行ssh user@remote_host tail -f /some/file
,tail -f /some/file
即使 ssh 连接关闭,它也会继续在 remote_host 上运行!
因此,经过多次连接和断开连接后,运行的次数会tail -f /some/file
增加。tail -f
ssh 连接关闭时如何实际终止?
我需要我的$TERM
是xterm-256color
TMUX以外(在“普通”与zsh的终端),但screen-256color
里面TMUX。
首先我试过:
export TERM='xterm-256color'
到我的~/.zshrc
.set -g default-terminal "screen-256color"
到我的~/.tmux.conf
现在,当我打开终端(比如 xterm)时,TERM
是xterm-256color
,这是正确的。但是当我运行 tmux 时,又TERM
是xterm-256color
!
然后我尝试在我的~/.zshrc
. 现在,当我打开终端时,TERM
是xterm
,而当我运行 tmux 时,TERM
是screen-256color
。如此看来,如果我设置TERM
的.zshrc
,首先TMUX套TERM
到screen-256color
,运行外壳(这是zsh的),和zsh的读取.zshrc
和复位TERM
来xterm-256color
。
那么,如何让TERM
要xterm-256color
在“普通”终端,并screen-256color
在TMUX?
相关问题:USB 连接/断开通知
当设备插入/拔出时,我会收到即时通知,这很棒。但是为了使它(几乎)完美,我还想获得像 一样的设备文件名/dev/ttyUSB0
,甚至更好的是,它的所有符号链接。
但是,我无法找到如何从udev
、 或 从lsusb
或以其他方式获取此信息。我拥有的设备的唯一 ID 是像/devices/pci0000:00/0000:00:1d.0/usb5/5-1
. 如何从中获取设备文件名?
我使用 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)
它有效,但它的工作非常愚蠢。我的问题是:
lsusb
输出中看到的相同?目前,我只收到诸如“已插入”和“未插入”之类的通知,但我找不到如何在我的 udev 规则中检索设备名称(如果可以,我会将它作为范围)下的每个设备节点/dev
都有自己的主要/次要编号对。我知道我们可以通过 的方式从设备节点检索这对数字stat
,如下所示:
stat -c 'major: %t minor: %T' <file>
Run Code Online (Sandbox Code Playgroud)
或者,ls -l
也显示这些数字。
但是我们如何通过给定的主要和次要编号获得设备节点?我知道的唯一方法是某种ls -l
+awk
技巧,但我真的希望有更好的解决方案。
我们可以通过以下方式轻松连接 ssh
到具有公共 IP 的远程机器。
但是现在我有一台没有公共 IP 的远程机器,我需要从我有公共 IP 的机器连接到它。这样,远程机器应该启动这个连接(添加一个客户端)。
我需要它,因为我的祖父在没有公共 IP 的计算机上,有时他的系统需要帮助。
在 Windows 上的类似情况下,我使用了 VNC 连接(通过 TightVNC),TightVNC 服务器有一个选项“添加客户端”:用户刚刚输入了客户端的 IP(即我的公共 IP),我的客户端已经处于“侦听模式”,并且当“服务器”添加一个客户端时,连接被初始化。
那么,是否可以通过 SSH 连接执行相同的技巧?
我正在开发一个将与连接的 USB HID 设备进行通信的应用程序。问题是还没有真正的设备(它正在由我们团队的另一部分开发),所以,我真的很想有一些方法来模拟它。
我能想到的理想实用程序应该是这样的:一个内核模块,当加载时,它会在系统中创建两个设备节点:
/dev/hidraw0
;当然,这个设备应该被我使用的任何 usb-hid 库看到,例如,hidapi
./dev/virtual_hid_1
。因此,当任何人写入 时/dev/virtual_hid_1
,这些数据应该从字面上读取/dev/hidraw0
,反之亦然。
通过这种方式,我可以用我想要的任何语言编写一些调试应用程序,无论是python
什么;它应该只是写入和读取/dev/virtual_hid_1
. 开发起来会很方便。
有这样的吗?
我需要获取所连接 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 插入/拔出通知(这里是相关问题),我需要执行类似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
.
我尝试为此使用w
Linux 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 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-rc6
是160 658 665
字节,但预编译initrd.img-3.16.0-031600rc6-generic
是16 819 611
字节。每个*.ko
模块都同样大。
为什么是这样?我没有为构建指定任何特殊选项(我输入的命令与我上面提到的完全相同)。如何“正确”构建它?
我对广播消息的行为很好奇
$ 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-terminal
并tmux
没有。但这听起来很奇怪,因为伪终端是由内核分配的,因此,它应该在需要的任何地方自动“注册”。
如果有人解释它是如何工作的以及为什么会这样(看起来很奇怪),我会很高兴。
我有 ncurses 应用程序(比如 aptitude)在普通 xterm(或 gnome-terminal,或我尝试过的任何其他终端)中运行良好,但是如果我在 tmux 会话中运行它,屏幕在我做一些导航时没有正确刷新通过菜单。
示例截图:
(完整分辨率:http : //i.imgur.com/jKLCX3A.png)
tmux 中的其他 ncurses 应用程序也会发生同样的情况:例如,cgdb。再一次,没有 tmux 他们工作得很好。
如何让它在 tmux 中也能正常工作?
(操作系统是 Linux Mint 13,如果这很重要的话)