使用 GDB 将 运行 进程 STDOUT/STDERR 重定向到 SSH STDOUT
Redirect running process STDOUT/STDERR to SSH STDOUT using GDB
我在嵌入式系统 (linux) 上有一个进程 运行。
它的 STDOUT/STDERR 是串行端口上的控制台。
我想将其输出(标准和错误)重定向到 SSH 会话的输出。
我读过你可以用 GDB 做类似的操作,但我不知道你将如何重定向到 SSH 会话的 STDOUT/STDERR 而不是文件。
由于磁盘资源不足,我无法对文件执行此操作。我也看过一些使用命名管道的示例,但我没有可用的 mkfifo 命令。我有GDB。
此外,假设这是可能的,当我关闭 SSH 会话时进程会终止吗?如果是这样,我可以先重定向回来吗?
谢谢。
只要能从gdb调用libc函数就可以。
#ssh root@embedded
查询守护进程输出位置:
# ls -l /proc/`pidof daemon`/fd/1
/proc/13202/fd/1 -> /dev/null
它可以不为空,它可以指向某个其他控制台甚至某个管道或文件,将此位置存储在某处。查询你的ssh会话输出位置:
# ls /proc/self/fd/1 -l
lrwx------ 1 root root 64 дек. 15 16:51 /proc/self/fd/1 -> /dev/pts/9
或者如果有的话直接打电话给 tty
。
现在开始工作:
# gdb -p `pidof daemon`
..
81 ../sysdeps/unix/syscall-template.S: No such file or directory.
(gdb) call open("/dev/pts/9",2,0)
= 0x3
(gdb) call dup2(3,2)
= 0x2
(gdb) call dup2(3,1)
= 0x1
(gdb) quit
Detaching from program: /root/daemon, process 13202
daemon output/errorput
在退出 ssh 会话之前重复相同的步骤,只需将 /dev/pts/9
替换为 open
系统调用中的初始输出位置。
我在嵌入式系统 (linux) 上有一个进程 运行。 它的 STDOUT/STDERR 是串行端口上的控制台。
我想将其输出(标准和错误)重定向到 SSH 会话的输出。 我读过你可以用 GDB 做类似的操作,但我不知道你将如何重定向到 SSH 会话的 STDOUT/STDERR 而不是文件。
由于磁盘资源不足,我无法对文件执行此操作。我也看过一些使用命名管道的示例,但我没有可用的 mkfifo 命令。我有GDB。
此外,假设这是可能的,当我关闭 SSH 会话时进程会终止吗?如果是这样,我可以先重定向回来吗?
谢谢。
只要能从gdb调用libc函数就可以。
#ssh root@embedded
查询守护进程输出位置:
# ls -l /proc/`pidof daemon`/fd/1
/proc/13202/fd/1 -> /dev/null
它可以不为空,它可以指向某个其他控制台甚至某个管道或文件,将此位置存储在某处。查询你的ssh会话输出位置:
# ls /proc/self/fd/1 -l
lrwx------ 1 root root 64 дек. 15 16:51 /proc/self/fd/1 -> /dev/pts/9
或者如果有的话直接打电话给 tty
。
现在开始工作:
# gdb -p `pidof daemon`
..
81 ../sysdeps/unix/syscall-template.S: No such file or directory.
(gdb) call open("/dev/pts/9",2,0)
= 0x3
(gdb) call dup2(3,2)
= 0x2
(gdb) call dup2(3,1)
= 0x1
(gdb) quit
Detaching from program: /root/daemon, process 13202
daemon output/errorput
在退出 ssh 会话之前重复相同的步骤,只需将 /dev/pts/9
替换为 open
系统调用中的初始输出位置。