所以我遇到了以下问题:我有一个在 Linux 上的 Tomcat7 服务器中运行的 Web 服务。然而,Web 服务必须执行一些命令(主要是文件操作,例如复制和装载)。复制 我已经用 java.nio 替换了,但我认为 mount 没有替代品.
所以我正在尝试从我的 Tomcat Java 进程中执行 shell 命令。不幸的是,它不执行我的命令。我以前用Java实现过shell命令的执行。所以我的代码应该是正确的:
Process pr = Runtime.getRuntime().exec("mount -o loop -t iso9660 <myimage> <mymountpoint>");
pr.waitFor();
<myimage>和 <mymountpoint>是绝对路径,所以也没有问题。
id和 pwd正在工作!/bin/bash -c "<command>" ,但没有用。所以我已经深入挖掘,现在我怀疑某些 Tomcat 安全策略(沙盒?)阻止我执行命令。由于安全对我来说不是问题(它是一个内部系统,与外界完全隔离),我尝试了一种 hack,最近变得非常流行:
System.setSecurityManager(null);
这也没有用。我在 RHEL6 上使用 Java7 和 Tomcat7。 Tomcat7刚刚解压!我在/etc/.. 或除/opt/tomcat/之外的任何其他文件夹中没有任何文件,我从 Tomcat 主页中提取了 zip。我在/opt/tomcat/conf 文件夹中搜索了安全设置,但我只能找到文件 catalina.policy,我似乎无法在其中为 shell 命令设置一些安全级别。
有什么想法吗?
最佳答案
一些事情:
System.setSecurityManager(null);
您刚刚破坏了应用程序的安全性。
Yes, Tomcat is running as root. If I execute id I'm root as well.
立即解决这个问题!
现在进入正题。你不应该让 Tomcat 执行任何事情,你需要将它推迟到一个单独的进程,无论是 shell 脚本还是另一个 Java 程序。这也应该消除(我希望)对运行 Tomcat 的根的依赖。应该可以以无法正常登录系统的非特权用户身份执行此命令。您可以通过配置 /etc/fstab 并为同一用户提供执行此操作的权限来执行此操作。从纯安全 POV 来看,挂载的进程不应由 tomcat 用户拥有。 tomcat 用户也不应该是 root。总结一下:
1) 停止以 root 身份运行 Tomcat
2) 在 Tomcat 上下文之外创建一个单独的进程来运行此挂载
3)创建一个tomcat用户,这个用户不能登录系统,也不能是特权用户(管理员, super 用户等)
4)创建一个进程用户,这个用户要和tomcat用户一样配置
5) 编辑 /etc/fstab 为进程用户提供正确挂载所需的权限。
关于java - 在Tomcat中执行shell命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12533799/
我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass
我想用ruby编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序
我遵循了教程http://gettingstartedwithchef.com/,第1章。我的运行list是"run_list":["recipe[apt]","recipe[phpap]"]我的phpapRecipe默认Recipeinclude_recipe"apache2"include_recipe"build-essential"include_recipe"openssl"include_recipe"mysql::client"include_recipe"mysql::server"include_recipe"php"include_recipe"php::modul
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
这可能是个愚蠢的问题。但是,我是一个新手......你怎么能在交互式rubyshell中有多行代码?好像你只能有一条长线。按回车键运行代码。无论如何我可以在不运行代码的情况下跳到下一行吗?再次抱歉,如果这是一个愚蠢的问题。谢谢。 最佳答案 这是一个例子:2.1.2:053>a=1=>12.1.2:054>b=2=>22.1.2:055>a+b=>32.1.2:056>ifa>b#Thecode‘if..."startsthedefinitionoftheconditionalstatement.2.1.2:057?>puts"f
我在用Ruby执行简单任务时遇到了一件奇怪的事情。我只想用每个方法迭代字母表,但迭代在执行中先进行:alfawit=("a".."z")puts"That'sanalphabet:\n\n#{alfawit.each{|litera|putslitera}}"这段代码的结果是:(缩写)abc⋮xyzThat'sanalphabet:a..z知道为什么它会这样工作或者我做错了什么吗?提前致谢。 最佳答案 因为您的each调用被插入到在固定字符串之前执行的字符串文字中。此外,each返回一个Enumerable,实际上您甚至打印它。试试
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
如何检查Ruby文件是否是通过“require”或“load”导入的,而不是简单地从命令行执行的?例如:foo.rb的内容:puts"Hello"bar.rb的内容require'foo'输出:$./foo.rbHello$./bar.rbHello基本上,我想调用bar.rb以不执行puts调用。 最佳答案 将foo.rb改为:if__FILE__==$0puts"Hello"end检查__FILE__-当前ruby文件的名称-与$0-正在运行的脚本的名称。 关于ruby-检查是否
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht