以下Ruby方法有什么区别?
exec,system和%x()或反引号
我知道它们用于通过Ruby以编程方式执行终端命令,但我想知道为什么有三种不同的方法来执行此操作.
我在ruby中有一堆系统调用,如下所示,我想同时检查它们的退出代码,以便在该命令失败时我的脚本退出.
system("VBoxManage createvm --name test1")
system("ruby test.rb")
Run Code Online (Sandbox Code Playgroud)
我想要类似的东西
system("VBoxManage createvm --name test1", 0) < - 第二个参数检查退出代码并确认系统调用成功,如果没有,则会引发错误或执行某种操作.
这有可能吗?
我已经尝试过这方面的事情,但也没有用.
system("ruby test.rb")
system("echo $?")
Run Code Online (Sandbox Code Playgroud)
要么
`ruby test.rb`
exit_code = `echo $?`
if exit_code != 0
raise 'Exit code is not zero'
end
Run Code Online (Sandbox Code Playgroud) 我正在构建一个可以帮助我管理服务器的守护进程.Webmin运行良好,就像打开服务器的shell一样,但我更喜欢能够从我设计的UI控制服务器操作,并向最终用户公开一些功能.
守护程序将从队列中获取操作并执行它们.但是,由于我将接受用户的输入,我想确保他们不被允许在特权shell命令中注入危险的东西.
这是一个例证我问题的片段:
def perform
system "usermod -p #{@options['shadow']} #{@options['username']}"
end
Run Code Online (Sandbox Code Playgroud)
一个解释更多的要点:https://gist.github.com/773292
如果对这种情况进行典型的输入和消毒输入就足够了,我并不乐观,作为一名设计师,我没有大量与安全相关的经验.我知道这对我来说应该是显而易见的,但事实并非如此!
如何确保将创建和序列化操作的Web应用程序无法将危险文本传递到接收操作的特权进程?
谢谢你的帮助
arb
类似于在Ruby中获取system()调用的输出,我正在运行系统命令,但在这种情况下,我需要在命令运行时输出STDOUT.
我必须从Ruby脚本执行一个shell命令,但我必须检索输出,以便稍后我可以在脚本中使用它.
这是我的代码:
output = system "heroku create" # => true
Run Code Online (Sandbox Code Playgroud)
但系统命令返回布尔值而不是输出.
简单地说,系统"heroku create"必须输出到我的屏幕(它确实),但也返回输出,以便我可以处理它.
我很困惑在这里阅读Ruby system方法的文档.我不确定什么是命令,什么是选项.如果我想执行以下操作,该怎么办?
wget -pk -nd -P /public/google www.google.com
Run Code Online (Sandbox Code Playgroud)
出于安全原因,我想使用其中一个不使用shell的版本(我给出的URL中的第二个和第三个表单,而不是第一个)
在Ruby脚本中使用系统调用时,可以获得该命令的输出,如下所示:
output = `ls`
puts output
Run Code Online (Sandbox Code Playgroud)
这就是这个问题的意义所在.
但有没有办法显示系统调用的连续输出?例如,如果运行此安全复制命令,则通过SSH从服务器获取文件:
scp user@someserver:remoteFile /some/local/folder/
Run Code Online (Sandbox Code Playgroud)
...随着下载的进度显示连续输出.但是这个:
output = `scp user@someserver:remoteFile /some/local/folder/`
puts output
Run Code Online (Sandbox Code Playgroud)
...不捕获该输出.
如何从Ruby脚本中显示下载的持续进度?
如何在Ruby中获取Linux系统的软件/硬件信息(这必须适用于Fedora,Ubuntu等)?
假设我有一个字符串very_long_string,我想将其内容发送到标准输出.但由于字符串很长,我想用来less在终端上显示文本.我用的时候
`less #{very_long_string}`
Run Code Online (Sandbox Code Playgroud)
我收到File not found错误消息,如果我使用:
`less <<< #{very_long_string}`
Run Code Online (Sandbox Code Playgroud)
我收到unexpected redirection错误消息.
那么,如何less从Ruby内部使用?
我正在编写一个ruby脚本,发现了这种奇怪的行为。
使用 ruby 2.4.2 [x86_64-darwin16]
基本上,我试图回显两个分开的消息,在index.rb文件中我得到了:
exec("echo 'teste'")
exec("echo 'teste2'")
Run Code Online (Sandbox Code Playgroud)
但是当我跑步时 ruby ./index.rb
输出为:
teste
Run Code Online (Sandbox Code Playgroud)
为什么会这样呢?
这不是输出吗?
testeteste2
Run Code Online (Sandbox Code Playgroud) value = %x( #{"svn lock #{@path}/#{@file}"} )
Run Code Online (Sandbox Code Playgroud)
=>
svn: warning: W160035: Path '/README.txt' is already locked by user 'tester' in filesystem 'some_path'
""
Run Code Online (Sandbox Code Playgroud)
返回空字符串,而不是svn:warning消息.我想记录svn警告消息.我究竟做错了什么.
感谢您的帮助.
我知道如何运行外部流程,因为有很多方法可以做到这一点。但是如何将其输出和退出代码捕获到变量中呢?这些运行流程的最流行的方式并不像我想要的那样工作:
a = `ls -l` # "a" captures only output
b = system "ls -l " # "b" captures only exit code
Run Code Online (Sandbox Code Playgroud)