2011-05-19 127 views
16

我有一个名为demo的GNU屏幕,我想向它发送命令。我该怎么做呢?将命令发送到GNU屏幕

screen -S demo -X /home/aa/scripts/outputs.sh 

yeilds No screen session found.

,做screen -ls表明,它没有运行。

+0

你是否在正确的安全上下文('id')? – sehe 2011-05-19 20:43:36

+0

这是什么意思? @sehe – dukevin 2011-05-19 20:45:48

+1

你在创建屏幕会话的同一个用户吗? – sehe 2011-05-19 20:53:27

回答

23

如果屏幕会话没有运行,您将无法将内容发送给它。首先启动它。

一旦你有一个会话,你需要区分屏幕命令和键盘输入。 screen -X需要屏幕命令。 stuff命令发送输入,并且如果要从shell提示符运行该程序,则还必须传递换行符。

screen -S demo -X stuff '/home/aa/scripts/outputs.sh 
' 

请注意,这可能是错误的方法。您确定要键入该会话中的任何活动吗?要在特定窗口输入输入,请使用

screen -S demo -p 1 -X stuff '/home/aa/scripts/outputs.sh 
' 

其中1是窗口号(您可以使用其标题)。

要在该会话中启动一个新窗口,请改用screen命令。 (这就是screen屏幕命令,而不是screen shell命令。)

screen -S demo -p 1 -X screen '/home/aa/scripts/outputs.sh' 
+0

Thanksgilles。在我写完你写的内容并重新连接屏幕之后,我看到这个:'/ home/aa/scripts/outputs.sh',但是脚本没有运行,直到我输入。任何有关如何使脚本执行的建议? – dukevin 2011-05-19 22:31:28

+0

@凯文:对不起,我错了一个报价。 'stuff'和你想发送的文本需要在不同的参数中。请注意引号内有换行符。 – Gilles 2011-05-19 23:12:28

+0

真棒,非常感谢! – dukevin 2011-05-19 23:27:21

2

我把这个一起捕获命令的输出。如果你想管一些输入,它也处理stdin。

function xscreen { 
    # Usage: xscreen <screen-name> command... 
    local SCREEN_NAME=$1 
    shift 

    # Create screen if it doesn't exist 
    if ! screen -list | grep $SCREEN_NAME >/dev/null ; then 
     screen -dmS $SCREEN_NAME 
    fi 

    # Create I/O pipes 
    local DIR=$(mktemp -d) 
    local STDIN=$DIR/stdin 
    local STDOUT=$DIR/stdout 
    local STDERR=$DIR/stderr 
    mkfifo $STDIN $STDOUT $STDERR 
    trap 'rm -f $STDIN $STDOUT $STDERR; rmdir $DIR' RETURN 

    # Print output and kill stdin when both pipes are closed 
    { cat $STDERR >&2 & cat $STDOUT & wait ; fuser -s -PIPE -k -w $STDIN ; } & 

    # Start the command (Clear line ^A^K, enter command with redirects, run with ^O) 
    screen -S $SCREEN_NAME -p0 -X stuff "$(echo -ne '\001\013') { $* ; } <$STDIN 1> >(tee $STDOUT) 2> >(tee $STDERR >&2)$(echo -ne '\015')" 

    # Forward stdin 
    cat > $STDIN 

    # Just in case stdin is closed 
    wait 
} 

把它更进了一步,它可以调用通过ssh此功能是有用的:

ssh [email protected] -n xscreen somename 'echo hello world' 

也许喜欢的东西ssh [email protected] "$(typeset -f); xscreen ..."结合起来,所以你不必已经定义的函数在远程主机上。