在学习即将到来的考试时,我遇到了以下问题:
用户试图执行的UNIX命令是哪一个?在标有*的行中发生了什么?出了什么问题?
我发现用户可能想要执行类似
的操作ln -s dir ls
但这并没有给我预期的输出。
答案 0 :(得分:0)
所以我自己设法回答了这个问题。
用户尝试执行的命令是 ln ls dir
,它基本上使用单词dir作为ls命令的“别名”。
这是错误的,因为用户试图在一个不向他授予写权限的目录中操作(很可能是/bin
目录),这意味着他无法创建文件(这个目录中的硬链接。
通过使用ktrace / kdump,我设法重现了输出:
[...]
*77019 ln CALL stat(0x7fffffffebab,0x7fffffffd668)
77019 ln NAMI "test/ls"
77019 ln RET stat 0
*77019 ln CALL lstat(0x7fffffffebb3,0x7fffffffd668)
77019 ln NAMI "test/dir"
77019 ln RET lstat -1 errno 2 No such file or directory
*77019 ln CALL stat(0x7fffffffebb3,0x7fffffffd668)
77019 ln NAMI "test/dir"
77019 ln RET stat -1 errno 2 No such file or directory
*77019 ln CALL lstat(0x7fffffffebb3,0x7fffffffd668)
77019 ln NAMI "test/dir"
77019 ln RET lstat -1 errno 2 No such file or directory
*77019 ln CALL linkat(AT_FDCWD,0x7fffffffebab,AT_FDCWD,0x7fffffffebb3,0x400)
77019 ln NAMI "test/ls"
77019 ln NAMI "test/dir"
77019 ln RET linkat -1 errno 13 Permission denied
[...]
*77019 ln CALL exit(0x1)
标有星号的步骤可以解释如下:
第一个系统调用是收集原始文件的inode信息('test/ln
)。
接下来,它检查目标文件(test/dir
)是否已存在,作为命名文件(stat
)还是作为符号链接(lstat
)。
因为不是这种情况,所以该过程会尝试链接原始示例中的文件(linkat
- :link
)。如前所述,由于权限,这会出错。
该过程最终以负退出代码结束。