我在工作时在开发盒上运行一个屏幕会话,然后在工作时通过 ssh 进入我的开发盒并恢复我的屏幕会话。从那里,我跳到其他机器。
有时,我发现自己从已经通过 ssh 远程屏幕会话的远程主机 ssh 到远程主机,而我ssh 到的远程主机不允许我完全断开连接。因此,我最终需要强制我的远程(第二个)ssh 会话终止,而不影响连接到屏幕的原始 ssh 会话。我知道杀死 ssh 是通过 a 完成的enter ~.,但就像我说的,我的本地 ssh 客户端拦截了该组合键,除了我需要将 ssh 重新连接到我的开发盒之外什么也没完成。
有人遇到过这个吗?如何在屏幕中终止远程 ssh 会话而不终止原始 ssh 会话?我在屏幕上找不到任何合适的东西来做到这一点。这也适用于额外的跃点 IE ssh -> screen -> ssh -> ssh(无法干净地注销)<-想要强制终止此 ssh 会话。
我尝试运行enter ~~.,这会终止第二个 ssh 会话,这样的方法有效。不过,对于第三次、第四次或更多次跳跃来说,这还不够好。
如果有一个解决方案能够工作,无论我通过 ssh 连接到其他机器的深度如何,那就太好了。
我的 ubuntu VM 不cron使用 TTY运行作业(即使我登录并从用户的 env 运行命令时也不运行)。
因此,cron 无法运行tmux或screen,阻止程序(特别是rtorrent在这种情况下)以简单且可附加的方式在后台运行。
rtorrent在启动时运行程序的最佳方法是什么,同时可以轻松地从任何终端附加、分离和终止进程?
我假设只运行相当于rtorrent &应该做的事情,但这不如 screen/tmux 方便。
我正在使用 LSF 作业系统开发 HPC。
screen在登录节点和大多数我可以通过 ssh 连接到它们的计算节点上工作正常。which命令显示screen位于/usr/bin. 但是,我发现了一些节点上,打坏只是找不到屏幕,神秘,我无法找到screen下/usr/bin该节点上。但我必须使用它。
所以我想也许我可以安装一个本地版本的screen,所以我下载了这个screen-4.5.1.tar.gz包。但是,./configure因错误而终止
配置:检查tgetent...配置:检查libcurses...配置:检查libtermcap...配置:检查libtermlib...配置:检查libncursesw...配置:检查libtinfow...配置:检查libncurses...配置:检查 libtinfo... 配置:错误:!!!没有 tgetent - 没有屏幕
谷歌显示,我们需要或者sudo apt-get install libncurses-dev或sudo apt-get install ncurses-dev。但是,我不是管理员,而且我在 HPC 上没有互联网连接。所以我认为手动安装ncurses应该没问题。我下载了ncurses-6.0.tar.gz。配置、制作、安装,最后我在我的自定义文件夹中得到了 4 个文件夹myInstall_ncurses:bin、lib、include、shared。
但是我screen现在应该如何安装?我试过这个
./configure --bindir="/home/myInstall_ncurses/bin" --includedir="/home/myInstall_ncurses/include" --libdir="/home/myInstall_ncurses/lib"
Run Code Online (Sandbox Code Playgroud)
但错误是一样的。怎么了?
有没有办法从正在运行的tmux会话中分离所有终端,除了我实际使用的终端?
看起来有点奇怪,但这样做的意义在于为最终用户远程会话保留一些“持久性”层,同时确保用户仅在“一个外壳”上使用系统。
正如解释在这里,人们很容易根据用户名创建会话:
if [[ "$TMUX" == "" ]] &&
[[ "$SSH_CONNECTION" != "" ]]; then
# Attempt to discover a detached session and attach
# it, else create a new session
WHOAMI=$(whoami)
if tmux has-session -t $WHOAMI 2>/dev/null; then
tmux -2 attach-session -t $WHOAMI
else
tmux -2 new-session -s $WHOAMI
fi
fi
Run Code Online (Sandbox Code Playgroud)
但我也想确保最后一个连接的终端是唯一一个仍然连接到用户tmux会话的终端。
它有办法做到这一点吗?我也接受基于screen(或其他多路复用器)的解决方案;)
我想做一个自动执行此操作的单行 bash 命令:
screen -S myserver
python myserver.py # inside the new screen
CTRL A, D (detach)
Run Code Online (Sandbox Code Playgroud)
我认为这行不通:
screen -S myserver && python myserver.py
Run Code Online (Sandbox Code Playgroud)
因为python myserver.py将不会启动里面的screen。
我广泛使用屏幕程序。通过减少每天设置会话所花费的时间,它极大地帮助了我。但是,现在我有 >8 个屏幕 - 我有时会忘记我在哪个屏幕。有没有办法找到我正在工作的屏幕会话的名称。 screen -ls 将列出所有屏幕会话。
有没有办法从所有当前活动的屏幕会话中分离出来 - 例如在一天结束时。
我试图Ctrlad,但惨遭失败并Ctrld改为输入,现在屏幕不会响应我的命令。它们出现了,并且在屏幕上运行的应用程序(我的世界服务器)仍然运行良好,但我无法发出服务器命令。
Ctrlad 工作并重新连接 screen -r -d -S minecraft工作正常,但没有命令注册。
有什么办法可以重新控制?
我已经尝试过script但它不起作用。
milenko@milenko-desktop:~/MTM$ script output.txt
Script started, file is output.txt
milenko@milenko-desktop:~/MTM$ wc -l output.txt
0 output.txt
Run Code Online (Sandbox Code Playgroud)
由于执行 C 代码,我的屏幕上有超过 4000000 行。只是其中的一部分
4194282 0.166666 2.35285e-06 -56.2841 -137.299 -129.386 4 0.974001
4194283 0.166666 2.2536e-06 -56.4712 -129.67 -131.872 4 0.577388
4194284 0.166666 2.33943e-06 -56.3089 -131.649 -132.051 4 0.693404
4194285 0.166666 2.40782e-06 -56.1838 -139.678 -129.377 4 0.702479
4194286 0.166666 2.61584e-06 -55.8239 -125.733 -128.783 4 0.585886
4194287 0.166666 2.60877e-06 -55.8356 -129.239 -127.815 4 0.773082
4194288 0.166666 2.71129e-06 -55.6682 -129.591 -127.553 4 0.796556
4194289 0.166666 …Run Code Online (Sandbox Code Playgroud) 我有一个非常简单的类似聊天的工具,可以在 GNUscreen会话中运行。该screen窗口分成两部分,上部运行tail -f file.txt和底部运行具有下列内容的脚本:
#!/bin/bash
while : ; do
read -p "Message: " msg
ctime=$(date +"%H:%M:%S")
echo "[${ctime}] User: ${msg}" >> file.txt
done
Run Code Online (Sandbox Code Playgroud)
非常简单,但可以根据我的要求完成工作。只有一个问题:当我按下ESC或 任何箭头键时,它会插入一个转义序列,^[[D例如。这会弄乱文件,导致糟糕的输出。
所以我的问题很简单:如何转义输入read以便写入文件是安全的?
我试过echo "[${ctime}] User: ${msg}" | strings >> file.txt这让它好多了,不再有大的混乱(例如没有被覆盖或错误地输出),但事情仍然不完美(例如输入te^[[Dst会变成te\n[Dst(\n作为一个实际的新行) )。