Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何向shell脚本中调用的java应用程序提供用户输入?_Java_Shell - Fatal编程技术网

如何向shell脚本中调用的java应用程序提供用户输入?

如何向shell脚本中调用的java应用程序提供用户输入?,java,shell,Java,Shell,我有一个shell脚本test.sh,它在内部调用Java应用程序MyApp #!/bin/bash # Invoking MyApp java MyApp MyApp从控制台读取2个参数,用户名和密码。运行此脚本将执行Java应用程序,该程序将提示用户输入用户名和密码 Username: user Password: **** 我想自动执行这个shell脚本。如何将用户名和密码作为参数传递给script test.sh 我所尝试的: 对包含参数的文件使用间接运算符 $ ./test.sh

我有一个shell脚本test.sh,它在内部调用Java应用程序MyApp

#!/bin/bash
# Invoking MyApp
java MyApp
MyApp从控制台读取2个参数,用户名和密码。运行此脚本将执行Java应用程序,该程序将提示用户输入用户名和密码

Username: user
Password: ****
我想自动执行这个shell脚本。如何将用户名和密码作为参数传递给script test.sh

我所尝试的:

对包含参数的文件使用间接运算符

$ ./test.sh <input
$./test.sh在这两种情况下
Console=System.Console()在MyApp.java中将
控制台设置为空

PS:寻找在不修改脚本或Java应用程序的情况下实现这一点的方法。“不,这不能做!”也是一个可以接受的答案。

可用于将(
|
)输入输送到任何程序:

echo -ne "user\npassword\n" | java MyApp
echo -ne "user\npassword\n" | ./test.sh
(此处换行符
\n
表示按下返回键,
-n
停止添加另一个换行符,
-e
启用换行符的解释)

可用于管道(
)输入到任何程序:

echo -ne "user\npassword\n" | java MyApp
echo -ne "user\npassword\n" | ./test.sh
(此处换行符
\n
表示按下返回键,
-n
停止添加另一个换行符,
-e
启用换行符的解释)

可用于管道(
)输入到任何程序:

echo -ne "user\npassword\n" | java MyApp
echo -ne "user\npassword\n" | ./test.sh
(此处换行符
\n
表示按下返回键,
-n
停止添加另一个换行符,
-e
启用换行符的解释)

可用于管道(
)输入到任何程序:

echo -ne "user\npassword\n" | java MyApp
echo -ne "user\npassword\n" | ./test.sh
(此处换行符
\n
表示按下返回键,
-n
停止添加另一个换行符,
-e
启用换行符的解释)

该程序可用于模拟人工控制台输入:

#!/usr/bin/expect
spawn ./test.sh
expect "Username: "
send "user\r"
expect "Password: "
send "password\r"
interact
(将其复制到文件中,然后运行该文件,例如
/expect\u script.sh

该程序可用于模拟人工控制台输入:

#!/usr/bin/expect
spawn ./test.sh
expect "Username: "
send "user\r"
expect "Password: "
send "password\r"
interact

(将其复制到文件中,然后运行该文件,例如
/expect\u script.sh

您不需要任何间接寻址。假设类路径设置正确,第一个示例中的脚本应该可以正常工作。您有权访问Java应用程序的源代码吗?你能改一下吗?谢谢你的评论。我认为我的问题没有被正确理解。我试着让它更具描述性。简而言之,我有一个Java应用程序,可以从控制台读取数据。此Java应用程序是从shell脚本调用的。。。有趣的是你自己也提到过,克里斯特。你不需要任何间接的解释。假设类路径设置正确,第一个示例中的脚本应该可以正常工作。您有权访问Java应用程序的源代码吗?你能改一下吗?谢谢你的评论。我认为我的问题没有被正确理解。我试着让它更具描述性。简而言之,我有一个Java应用程序,可以从控制台读取数据。此Java应用程序是从shell脚本调用的。。。有趣的是你自己也提到了,克丽什特。谢谢你的回答。我认为我的问题没有被正确理解。我试着让它更具描述性。简而言之,我有一个Java应用程序,可以从控制台读取数据。此Java应用程序是从shell脚本调用的。@Krishter您尝试过Drgabble建议的方法吗?它实际上是将文本通过管道传输到应用程序,因此应该可以正常工作。OTOH,如果你没有控制台,那么你就不能用管道连接它;直接使用stdin/stdout。@vaxquis,此解决方案假定我可以编辑shell脚本。不幸的是,这不是一个选择。如果我理解你评论的第二部分,你是建议将Java应用程序的源代码更改为不从控制台读取?我再次寻找不必更改预构建二进制文件的选项。@Krishter你自相矛盾了。据我所知,您希望a)源代码和二进制文件不受影响,b)二进制执行脚本不受影响,c)修改closed的行为(由于确切的脚本内容;如果它可以选择传递更多参数等,这不会是一个问题)脚本二进制源代码系统。因此,唯一可行的解决方案是通过替换
bash
可执行文件、运行时代码注入或类似的技巧/黑客来破坏操作系统。@vaxquis我看不出有任何矛盾。在我的问题中,我没有提到修改源代码是一种选择。如果是这样的话,我会自己做的,而不是把它贴在这里。这是一个真实的场景,涉及到预构建的二进制文件以及以下问题,主要区别在于Java应用程序参与者。谢谢你的回答。我认为我的问题没有被正确理解。我试着让它更具描述性。简而言之,我有一个Java应用程序,可以从控制台读取数据。此Java应用程序是从shell脚本调用的。@Krishter您尝试过Drgabble建议的方法吗?它实际上是将文本通过管道传输到应用程序,因此应该可以正常工作。OTOH,如果你没有控制台,那么你就不能用管道连接它;直接使用stdin/stdout。@vaxquis,此解决方案假定我可以编辑shell脚本。不幸的是,这不是一个选择。如果我理解你评论的第二部分,你是建议将Java应用程序的源代码更改为不从控制台读取?我再次寻找不必更改预构建二进制文件的选项。@Krishter你自相矛盾了。据我所知,您希望a)源代码和二进制文件不受影响,b)二进制执行脚本不受影响,c)修改closed的行为(由于确切的脚本内容;例如,如果它有传递更多参数的选项等,这不会是一个问题