./sysMole -time Aug 18 18
参数“ -time”,“ Aug”,“ 18”和“ 18”成功传递给脚本。
现在,此脚本被设计为在远程计算机上执行,但是可以从本地计算机上的本地目录执行。示例:
ssh root@remoteServer "bash -s" < /var/www/html/ops1/sysMole
也可以。但是,当我尝试包括上述参数(时间为8月18日)时,就会出现问题,例如:
ssh root@remoteServer "bash -s" < /var/www/html/ops1/sysMole -time Aug 18 18
运行该脚本后,出现以下错误:
bash: cannot set terminal process group (-1): Invalid argument
bash: no job control in this shell
请告诉我我做错了什么,这真令人沮丧。
#1 楼
您与您的示例非常接近。当您将其与诸如此类的参数一起使用时,它可以正常工作。示例脚本:
$ more ex.bash
#!/bin/bash
echo
有效的示例:
$ ssh serverA "bash -s" < ./ex.bash "hi" "bye"
hi bye
但是对于以下类型的参数却失败: >您遇到的问题是,在我的示例中,参数
-time
或--time
被解释为切换到bash -s
。您可以通过使用bash
自变量终止--
来使其自身平整,从而终止它。 >示例#1:
$ ssh serverA "bash -s" < ./ex.bash "--time" "bye"
bash: --: invalid option
...
#2:
$ ssh root@remoteServer "bash -s" -- < /var/www/html/ops1/sysMole -time Aug 18 18
#3:
$ ssh serverA "bash -s" -- < ./ex.bash "-time" "bye"
-time bye
#4:
$ ssh serverA "bash -s" -- < ./ex.bash "--time" "bye"
--time bye
注意:只是要弄清楚重定向出现在命令行上没有什么区别,因为
ssh
无论如何都使用其参数的串联来调用远程shell,引用并没有多大区别,除非您需要在远程shell上进行引用,例如示例#4: > $ ssh serverA "bash -s" -- < ./ex.bash --time "bye"
--time bye
评论
你是一个天才!我该怎么做才能达到您的水平?我有很多工作要做。非常感谢。
– AllenD
13年8月20日在2:21
@AllenD-继续问问题,并尝试并尽可能多地参与该网站。我总是每天尝试学习新知识。在您提出问题之前,我也不知道该怎么做。 8)。感谢您的提问!
–slm♦
13年8月20日在2:25
请注意,重定向可以出现在命令的任何位置:例如bash -s---time bye <./ex.bash甚至<./ex.bash bash -s---time bye。这是因为Shell首先取出重定向指令(无论命令在命令中的位置如何),然后设置重定向,然后在适当的位置执行命令行的其余部分。
– Lesmana
13年8月20日在9:30
@sim我正在尝试做同样的事情,但是是从脚本而不是命令行执行的。关于如何执行此操作的任何想法?由于某种原因,将您的确切答案放在反引号中根本不起作用。相反,它运行本地指定的脚本,并且输出作为命令通过ssh发送到bash。
–krb686
2015年3月3日在21:42
@ krb686-我想问一个新的问题。
–slm♦
15年3月4日在1:33
#2 楼
关于处理任意参数如果您实际上仅使用单个字符串,即。
-time Aug 18 18
,那么您可以简单地对其进行硬编码,现有的答案将告诉您如何充分地做到这一点。另一方面,如果您需要传递未知的参数(例如要在其他系统上显示的消息,或最终用户可以控制其名称的创建文件的名称),则需要格外小心。使用
bash
或ksh
作为/bin/sh
如果远程
/bin/sh
由bash或ksh提供,则可以安全地对不可信的参数列表执行以下操作,这样即使恶意名称(例如$(rm -rf $HOME).txt
)也可以安全地作为参数传递: /> 为了避免受到足够恶意的论点数据(即使要转义的字符串中存在不可打印的字符,尝试利用bash中
/bin/sh
在bash中使用的不符合POSIX的引用),即使printf %q
是基线, POSIX(例如/bin/sh
或dash
),它变得更有趣了:runRemote() {
local args script
script=; shift
# generate eval-safe quoted version of current argument list
printf -v args '%q ' "$@"
# pass that through on the command line to bash -s
# note that $args is parsed remotely by /bin/sh, not by bash!
ssh user@remote-addr "bash -s -- $args" < "$script"
}
用法(对于任一abov e)
上面给出的功能可以按以下方式调用:
runRemote() {
local script=; shift
local args
printf -v args '%q ' "$@"
ssh user@remote-addr "bash -s" <<EOF
# pass quoted arguments through for parsing by remote bash
set -- $args
# substitute literal script text into heredoc
$(< "$script")
EOF
}
...或...
# if your time should be three arguments
runRemote /var/www/html/ops1/sysMole -time Aug 18 18
#3 楼
将命令括在引号中,如下所示:ssh myserver "date +\"Date: %Y%m%d %H:%M\";printf \"Uptime: \";uptime;printf \"uname: \";uname -a"
Date: 20200409 20:02
Uptime: 20:02:29 up 66 days, 55 min, 2 users, load average: 0.06, 0.05, 0.08
uname: Linux zltcmtn23aecc1rx7322 4.4.0-116-generic #140-Ubuntu SMP Mon Feb 12 21:23:04 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
Connection to 105.31.182.217 closed.
#4 楼
说aa是一个本地文件,其中包含ls$ssh servername "cat | bash" < a.a
将127.0.0.1更改为您的远程ip是什么
这两个给出有关以下内容的消息伪tty分配,但它们可以工作。
$ cat a.a | ssh 127.0.0.1
$ ssh 127.0.0.1 <a.a
或
$ cat a.a | ssh 127.0.0.1 bash or
$ ssh 127.0.0.1 bash < a.a
评论
我正在努力寻找能回答这个问题的程度。
– ChristWue
16-09-8的1:39
质量和格式令人怀疑。我也没有看到接受的答案中没有任何新的有用信息。
–朱莉(Julie Pelletier)
16-9-8下午4:07
@JuliePelletier我给出了一些“猫”的例子,而不是被接受的答案。知道做事的替代方式是件好事。
– barlop
16 Sep 8'在5:18
那不是一件好事。你的猫没用。
–斯科特
2016年9月8日下午5:20
哦,我的天啊。我忽略了与猫的无用使用有关的链接,因为我认为到目前为止,至少每个人都已经听说过该词组。显然,这对我而言是一个错误的假设。
–斯科特
16 Sep 8'在5:43
评论
“ bash -s”是您可以从标准输入(即文件)执行脚本的方法之一。