运行 包含带屏幕的 STDIN 重定向的命令

Running a command that includes an STDIN redirect with screen

使用 Gradle SSH plugin 我将 .jar 文件部署到另一台机器。

然后我想 运行 在分离的 screen 会话中那个 jar。 如果应用程序不需要在 STDIN 上输入,这将不是问题,运行ning screen -dmS screen-name java -jar my.jar.

我尝试使用 here-string 以下列方式提供输入(除了其他方法),但我没有让它们中的任何一个工作:

screen -dmS screen-name java -jar my.jar <<< "firstInputLine
SecondInputLine
"

谁能指出我正确的方向?谢谢!

我认为您的问题是您将输入通过管道传输到屏幕命令,而不是实际传输到 java 进程。我会按照以下方式进行:

  1. 根据您的输入创建一个文件,类似于 echo "foo" > input.txt
  2. scp那个文件到机器
  3. 运行 screen 命令并使 java 进程直接读取文件(如果该程序可以这样做)或通过 运行ning 正确地传输它bash 命令直接代替 java 命令。类似于 screen -dmS screen-name bash \"cat input.txt | java -jar ...\"

免责声明:上述转义只是近似地表达我的观点 ;-)

我目前解决这个问题的方法是首先创建分离的 screen 会话,然后使用第二个 screen 调用,使用屏幕的 stuff 命令转发输入,而不是使用此处-不再是字符串:

screen -dmS screen-name java -jar my.jar && 
screen -S screen-name -p 0 -X stuff "firstInputLine^MsecondInputLine^M"

(^M 被解释为 ENTER)