我刚刚完成了一台CTF机器,但我的大脑很难弄清楚为什么它会起作用,所以我想问一下,因为在我知道之前我将无法入睡!我的问题是关于相对路径的使用。
下面是 Ruby 脚本的源代码,其中包含
list_from_file
函数,该函数使用相对路径来读取 dependencies.yml
文件。
henry@precious:~$ cat /opt/update_dependencies.rb
# Compare installed dependencies with those specified in "dependencies.yml"
require "yaml"
require 'rubygems'
# TODO: update versions automatically
def update_gems()
end
def list_from_file
YAML.load(File.read("dependencies.yml"))
end
def list_local_gems
Gem::Specification.sort_by{ |g| [g.name.downcase, g.version] }.map{|g| [g.name, g.version.to_s]}
end
gems_file = list_from_file
gems_local = list_local_gems
gems_file.each do |file_name, file_version|
gems_local.each do |local_name, local_version|
if(file_name == local_name)
if(file_version != local_version)
puts "Installed version differs from the one specified in file: " + local_name
else
puts "Installed version is equals to the one specified in file: " + local_name
end
end
end
end
我有限的知识推断,当我执行此脚本时,它只会搜索以在与脚本相同的目录中查找dependencies.yml
文件,在本例中为
/opt/
。然而,事实并非如此!当我在
/tmp
目录中创建此文件,然后运行脚本时,它实际上会拾取它!我搜索并阅读了一些文章以及其他关于
相对路径与绝对路径 的 stackoverflow 帖子,但没有一个真正解释了为什么会发生这种情况。
如果我错过了任何密切相关的帖子,我提前表示抱歉!
当前工作目录。当前工作目录不一定与脚本所在的目录相同,而是启动 Ruby 时所在的目录。
示例:
> cd /tmp
> ruby /some/path/somewhere/to/my/script.rb
在这种情况下script.rb
的当前工作目录是什么?答案:是
/tmp
,因为那是你启动脚本时所在的目录。要从脚本本身显示当前工作目录,您可以添加一行
puts Dir.pwd
,脚本将打印出当时正在哪个文件夹中运行。要更改脚本的当前工作目录,可以使用
Dir.cwd
。您可以看到为什么使用相对路径很容易导致混乱,因为这完全取决于 Ruby 可执行文件的启动目录。它可能在任何地方。
这就是为什么大多数脚本使用
绝对路径或相对于脚本文件本身的路径。要使用相对于脚本文件本身的路径,您可以使用 __dir__