当前位置: 首页 > 面试题库 >

如何在Spring Boot远程shell中将参数和选项传递给自定义远程shell命令?

庞彬
2023-03-14
问题内容

根据上述问题的建议,我正在尝试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’