使用程序的 PID 作为同一个程序的参数
Use the PID of a prog as an argument of this same prog
我有一个等待字符串作为参数的 C 程序,我可以这样使用它:
./myprog "hello"
我想做的是:
- 不带参数启动程序
- 获取此程序的 PID
- 以此PID为基础制作字符串
- 将此字符串作为 运行 程序的参数传递。
我知道如何获取 pid。我可以这样做:
./myprog &
PID=$!
我有另一个程序来计算我想要的字符串:
./StringFromPid $PID
我不知道的是:如何使用最后一行的结果作为 myProg 的输入(它已经启动,但没有他的字符串 arg,知道当它在没有 arg 的情况下启动时它会简单地关闭...)
我试过:
./StringFromPid $PID | ./myprog
但是它有两个问题:
它启动了另一个 myprog 实例,它有另一个 pid,所以这不是我想要的。
出于某种原因,它甚至不起作用。我的意思是,./StringFromPid $PID 的输出不用作 ./myprog 的输入。它只是关闭,就像没有 arg 一样。
无法修改myprog,但可以修改StringFromPid;我什至可以将 StringFromPid 的代码放在我的 bash 脚本中,因为它一点也不大。我已经阅读了很多关于 bash 脚本的教程,但我仍然是新手(没有太多练习)
我找到了一个解决方案,但它不是最佳的(远非最佳):
#!/bin/bash
./myprog $(echo $(./StringFromPid $(let "a = $$";let "b = 5"; let "c = a + b"; echo $c)))
+5是因为我刚刚发现我启动这个脚本的时候,他的PID和myprog的PID有+5的区别。不知道为什么,但它有效。
不过,我仍然愿意寻求更好的解决方案。事实上,这在我的电脑上工作(顺便说一下,我在 Ubuntu 16.04,)但最后它必须在我没有管理员权限的 CTF 服务器上工作
最简单的方法是执行 C 程序。
#!/bin/bash
# pid of current shell
PID1=$$
echo $PID1
# do stuff
(
# this is a subshell
# $$ doesn't change but BASHPID does
PID2=$BASHPID
echo $PID2
# the pid of this C program will be $PID2
exec myCprogram $(./StringFromPid $PID2)
# exec doesn't return
echo "can't get here"
)
# do more stuff
如果您使用的平台支持它,则可以使用 the LD_PRELOAD trick 覆盖 getpid()
。
但是exec
更简单。
我有一个等待字符串作为参数的 C 程序,我可以这样使用它:
./myprog "hello"
我想做的是:
- 不带参数启动程序
- 获取此程序的 PID
- 以此PID为基础制作字符串
- 将此字符串作为 运行 程序的参数传递。
我知道如何获取 pid。我可以这样做:
./myprog &
PID=$!
我有另一个程序来计算我想要的字符串:
./StringFromPid $PID
我不知道的是:如何使用最后一行的结果作为 myProg 的输入(它已经启动,但没有他的字符串 arg,知道当它在没有 arg 的情况下启动时它会简单地关闭...)
我试过:
./StringFromPid $PID | ./myprog
但是它有两个问题:
它启动了另一个 myprog 实例,它有另一个 pid,所以这不是我想要的。
出于某种原因,它甚至不起作用。我的意思是,./StringFromPid $PID 的输出不用作 ./myprog 的输入。它只是关闭,就像没有 arg 一样。
无法修改myprog,但可以修改StringFromPid;我什至可以将 StringFromPid 的代码放在我的 bash 脚本中,因为它一点也不大。我已经阅读了很多关于 bash 脚本的教程,但我仍然是新手(没有太多练习)
我找到了一个解决方案,但它不是最佳的(远非最佳):
#!/bin/bash
./myprog $(echo $(./StringFromPid $(let "a = $$";let "b = 5"; let "c = a + b"; echo $c)))
+5是因为我刚刚发现我启动这个脚本的时候,他的PID和myprog的PID有+5的区别。不知道为什么,但它有效。
不过,我仍然愿意寻求更好的解决方案。事实上,这在我的电脑上工作(顺便说一下,我在 Ubuntu 16.04,)但最后它必须在我没有管理员权限的 CTF 服务器上工作
最简单的方法是执行 C 程序。
#!/bin/bash
# pid of current shell
PID1=$$
echo $PID1
# do stuff
(
# this is a subshell
# $$ doesn't change but BASHPID does
PID2=$BASHPID
echo $PID2
# the pid of this C program will be $PID2
exec myCprogram $(./StringFromPid $PID2)
# exec doesn't return
echo "can't get here"
)
# do more stuff
如果您使用的平台支持它,则可以使用 the LD_PRELOAD trick 覆盖 getpid()
。
但是exec
更简单。