根据上述问题的建议,我正在尝试Spring Boot远程外壳。
我已根据此文档创建了自定义命令,
http://docs.spring.io/spring-boot/docs/current/reference/html/production-
ready-remote-shell.html#production-ready-extending-the-remote-
shell
但是在现实的用例中,我们大多数都有参数和命令选项。在文档中没有提及如何定义它们,以便用户在运行命令时通过。
这是很好的解释,并且很容易做到。
http://docs.spring.io/spring-shell/docs/current/reference/htmlsingle/#simple-
application
https://projects.spring.io/spring-shell/
但是我们不能将弹簧壳与弹簧靴一起使用。
对于这些用例,可靠的生产就绪解决方案是什么?
更新:
在CRaSH doc上获得了解决方案
http://www.crashub.org/1.3/reference.html#developping_commands
登录到shell后,我可以在命令列表中看到myCommand,但是当我运行command时,
但我越来越例外
"Could not create command commandName instance".
我试图在命令中使用spring bean,所以我做了自动装配,例如
package commands;
import org.crsh.cli.Argument;
import org.crsh.cli.Command;
import org.crsh.cli.Usage;
import org.crsh.cli.Option;
import org.crsh.cli.Required;
import org.crsh.command.BaseCommand;
import org.crsh.command.InvocationContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@Usage("My test computation commands.")
public class myCommand extends BaseCommand {
protected final Logger log = LoggerFactory.getLogger(getClass());
/**
*
*/
public Service1 service1;
/**
*
*/
public Service2 service2;
/**
* @param service1
* @param service2
*/
@Autowired
public myCommand(Service1 service1, Service2 service2) {
super();
this.service1 = service1;
this.service2 = service2;
}
@Usage("Test command")
@Command
public Map<String, Double> command1(InvocationContext<Object> context, @Usage("id") @Required @Argument int id)
throws Exception {
Map<String, Double> result = new HashMap<>();
result.put("key1", service1.compute(id));
result.put("key2", service2.compute(id));
return result;
}
}
我认为您不能在Remote Shell命令中注入bean。
但是,您可以将InvocationContext注入到方法中,并使用它从上下文中检索spring托管的bean:
@Usage('Example using spring.beanfactory')
@Command
def mycommand(InvocationContext context, ...) {
BeanFactory beans = context.attributes['spring.beanfactory']
YourBean bean = beans.getBean(YourBean.class);
...
}
一个对我有用的完整示例:
package commands
import org.crsh.cli.Command
import org.crsh.cli.Usage
import org.crsh.command.InvocationContext
import org.springframework.beans.factory.BeanFactory
import com.alexbt.goodies.MyBean
class SayMessage {
String message;
SayMessage(){
this.message = "Hello";
}
@Usage("Default command")
@Command
def main(InvocationContext context, @Usage("A Parameter") @Option(names=["p","param"]) String param) {
BeanFactory beanFactory = (BeanFactory) context.getAttributes().get("spring.beanfactory");
MyBean bean = beanFactory.getBean(MyBean.class);
return message + " " + bean.getValue() + " " + param;
}
@Usage("Hi subcommand")
@Command
def hi(InvocationContext context, @Usage("A Parameter") @Option(names=["p","param"]) String param) {
BeanFactory beanFactory = (BeanFactory) context.getAttributes().get("spring.beanfactory");
MyBean bean = beanFactory.getBean(MyBean.class);
return "Hi " + bean.getValue() + " " + param;
}
}
> saymsg -p Johnny
> Hello my friend Johnny
> saymsg hi -p Johnny
> Hi my friend Johnny
如果你需要在命令行下插入一个值,通常需要使用引号将其括起来,尤其是当其包含空格时更是如此。 shellquote 函数可以携带任意数量的参数(包括数组), 它会使用引号将每个参数都括起来并返回一个可以传递到 Shell 命令行上的以空格间隔的字符串。 在下面的例子中,我们想要创建一个用于文件改名的 exec 资源, 然而源文件名和目标文件名都包含空格,因此在命令行上需要正确地使用引号将它们括起来。
问题内容: 我试图运行在运行时调用shell脚本的Java代码。 当我在终端中运行脚本时,我正在将参数传递给脚本 码: Java代码: 如何在Java代码中为脚本传递参数? 问题答案: 在Java的最新版本中创建进程的首选方法是使用类,这使得此操作非常简单: 但是,如果您确实出于某种原因想要/需要使用该方法,则可以使用该方法的重载版本,这些版本允许显式指定参数:
问题内容: 我有一个在远程服务器上执行Shell脚本的Hudson作业。 它的shell命令是: 我将此构建标记为已参数化,并添加了一个字符串参数: 当我运行它时,会分配参数,但会将其传递到Shell脚本中。 问题答案: 参数化的Build Jenkins插件文档指出 由参数添加的所有环境变量均为 大写 在您的情况下,这应该起作用:
我试图在我的网页中使用PHP从远程机器中的shell获得结果。我用了这些台词: 我试图得到结果在我的网页在windows机器和libssh2已经包含在easyphp. 有什么想法吗?
问题内容: 我希望能够使用ssh从我的机器上运行命令并传递环境变量 这是我正在尝试的: 是在进行ssh调用的计算机上设置的,并且由于该变量在远程主机上不存在,因此不会被提取。 如何传递的值? 问题答案: 如果您使用 代替 您的外壳程序会在将命令字符串发送到远程主机之前进行插值。
问题内容: 我有一个用Node.js编写的Web服务器,我想使用一个特定的文件夹启动。我不确定如何在JavaScript中访问参数。我正在像这样运行节点: 这是我的服务器代码。Node.js帮助说这是可能的: 如何在JavaScript中访问这些参数?不知何故我无法在网上找到此信息。 问题答案: 参数存储在 以下是有关处理命令行参数的节点文档: 是一个包含命令行参数的数组。第一个元素是’node’