我想通过远程服务器上的脚本运行top命令。 我还想添加一个过滤器,它只允许整数作为命令行参数传递给将在远程服务器上运行的脚本
这是我使用的命令: -
ssh -oConnectTimeout=5 -oBatchMode=yes -l group servername 'bash -s' < /some/path/top_command.sh
现在,当我没有向脚本传递任何参数时,它工作正常并显示top
命令的前20行。
它也过滤掉任何字符(非整数)
之类的垃圾值但问题在于负整数
ssh -oConnectTimeout=5 -oBatchMode=yes -l group servername 'bash -s' < /some/path/top_command.sh -7
现在我收到错误: -
Usage: bash [GNU long option] [option] ...
bash [GNU long option] [option] script-file ...
GNU long options:
--debug
--debugger
--dump-po-strings
--dump-strings
--help
--init-file
--login
--noediting
--noprofile
--norc
--posix
--protected
--rcfile
--restricted
--verbose
--version
--wordexp
Shell options:
-irsD or -c command or -O shopt_option (invocation only)
-abefhkmnptuvxBCHP or -o option
但是当我尝试不使用top_command.sh脚本运行命令时: -
ssh -oConnectTimeout=5 -oBatchMode=yes -l group servername 'top -b -n 1 | head -n -2'
我获得了top
命令输出的负head
值
现在我很困惑,我做错了什么?
btw top_command.sh的内容
1 #!/bin/bash
2 if [[ $1 == "" ]]; then
3 echo -e "No Argument passed:- Showing default top 20 lines\n"
4 command=$(top -b -n 1 | head -n 20 2>&1)
5 echo "$command"
6 else
7 re='^[-0-9]+$'
8 if [[ $1 =~ $re ]]; then
9 command=$(top -b -n 1 | head -n $1 2>&1)
10 echo "$command"
11 else
12 echo "Argument passed is not an integer"
13 fi
14 fi
答案 0 :(得分:1)
你可以这样做
ssh -oConnectTimeout=5 -oBatchMode=yes -l group servername bash -s -- -7 < /some/path/top_command.sh
--
是一个常见的选项 - 参数分隔符,在将以-
开头的参数传递给命令时很有用。 mv
和rm
等命令也会识别它。 --
之后的所有内容都不再作为选项进行测试,并且已被视为正常参数。如果文件以rm
开头,则mv
和-
会很有用。