【问题标题】:Linux - created processes [closed]Linux - 创建的进程[关闭]
【发布时间】:2013-11-24 05:56:52
【问题描述】:

我是 Linux Shell 的新手,有点卡在一个任务上: 我们应该使用 ssh 连接到 linux 机器。然后我们应该发出 ls 命令并使用 ps 和 pstree 查看我们在机器中创建了哪些进程以使 ls 命令工作。然后我们需要找出这些进程的 RUID 和 EUID。并解释在途中访问了哪些文件以及原因。

我知道网上有很多关于shell命令的文档,所以我当然先尝试使用google解决问题。我发现了如何使用 ps -ef 列出所有进程以及如何获取特定进程的 RUID 或 EUID。 但是我怎样才能看到帮助我实现 ls 命令的进程呢?如果我先 ls 然后 ps,则 ls 进程已经完成,唯一的活动进程是 ps 和 ssh 进程...... 我也不知道作业中的文件是什么意思。

【问题讨论】:

  • 开始阅读所有类unix系统的典型手册页,而不是谷歌搜索。对于任何命令(例如ls),只需输入man ls,您就可以在与您的系统完全匹配的版本中找到该命令及其所有选项的准确描述。这是您可以获得的最精确的文档。
  • 对于进程中访问的文件:考虑登录时会发生什么:哪些进程可能访问哪些文件来决定是否授予您访问权限?为您启动的第一个过程是什么?该过程通常读取哪些初始化文件?是否还会写入一些日志条目?去哪儿? ...

标签: linux shell process ssh ps


【解决方案1】:

您必须确保ls 至少需要一些时间。您可以尝试ls -R(递归)包含一些数据的目录。一旦找到合适的目录(使用/ 作为最后的手段,但这可能非常 很长)启动lspsssh,并将ls 发送到后台:

$ ssh host "ls -R >>/dev/null & pstree -u user" | grep ls
sshd---bash-+-ls

您会看到创建了一个sshd 进程,以及一个bash 进程,最后是一个ls 进程。

查找EUID和RUID;使用以下构造:

$ ssh host "ls -R >> /dev/null & ps -o ruid,euid -p \$!"
 RUID  EUID
  501   501

注意$!返回最后一个命令的pid(这里是ls),它需要用\转义,因为我们不希望它在本地计算机上解析,而是在远程计算机上解析。

要查找打开了哪些文件,您可以在序列中的每个进程( sshd, bash, ls),也许还有本地的ssh 命令。

【讨论】:

  • lsof 也可以生成打开文件列表。
  • @JonathanLeffler 我考虑过lsof,但它只会列出在lsof 运行时打开的文件。例如,lsof -p $(pgrep -u user bash|head -1) 通常不会列出 .bashrc
  • OK:中肯的评论。或许值得一提——表面上可用的被拒绝解决方案可能会有所帮助。摸索strace 的输出也不好玩,但它会覆盖所有打开的文件。
  • 好的,我会更新我的答案。请注意,strace ... |& grep ^read 完成了大部分工作。
  • “使用 / 作为最后手段”是什么意思?不幸的是,只有一个目录和一个文件,所以我认为 ls 过程完成得很快。
【解决方案2】:

我怀疑设置任务的人没有真正考虑或尝试一下。

ls 在任何没有陷入 1980 年代时间扭曲的机器上真的很快完成,那么你应该如何减慢它的速度呢?使用调试器?这是一种先进的技术。

此外,我将告诉您一个秘密,即启动哪些进程以使ls 命令工作...ls就是这样。再说一次,除非这是我从未听说过的 1980 年代的奇怪回归。

向布置任务的人投诉。

【讨论】:

    猜你喜欢
    • 2018-10-27
    • 1970-01-01
    • 2011-08-18
    • 2014-02-11
    • 2021-07-01
    • 2011-01-26
    • 1970-01-01
    • 2017-10-12
    • 1970-01-01
    相关资源
    最近更新 更多