我有一个名为demo的GNU屏幕,我想向它发送命令。我该怎么做呢?将命令发送到GNU屏幕
screen -S demo -X /home/aa/scripts/outputs.sh
yeilds No screen session found.
,做screen -ls
表明,它没有运行。
我有一个名为demo的GNU屏幕,我想向它发送命令。我该怎么做呢?将命令发送到GNU屏幕
screen -S demo -X /home/aa/scripts/outputs.sh
yeilds No screen session found.
,做screen -ls
表明,它没有运行。
如果屏幕会话没有运行,您将无法将内容发送给它。首先启动它。
一旦你有一个会话,你需要区分屏幕命令和键盘输入。 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'
我把这个一起捕获命令的输出。如果你想管一些输入,它也处理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 ..."
结合起来,所以你不必已经定义的函数在远程主机上。
你是否在正确的安全上下文('id')? – sehe 2011-05-19 20:43:36
这是什么意思? @sehe – dukevin 2011-05-19 20:45:48
你在创建屏幕会话的同一个用户吗? – sehe 2011-05-19 20:53:27