我编写了一个在本地执行时可以正常运行的脚本:

./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


请告诉我我做错了什么,这真令人沮丧。

评论

“ bash -s”是您可以从标准输入(即文件)执行脚本的方法之一。

#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,那么您可以简单地对其进行硬编码,现有的答案将告诉您如何充分地做到这一点。另一方面,如果您需要传递未知的参数(例如要在其他系统上显示的消息,或最终用户可以控制其名称的创建文件的名称),则需要格外小心。


使用bashksh作为/bin/sh


如果远程/bin/sh由bash或ksh提供,则可以安全地对不可信的参数列表执行以下操作,这样即使恶意名称(例如$(rm -rf $HOME).txt)也可以安全地作为参数传递: />
为了避免受到足够恶意的论点数据(即使要转义的字符串中存在不可打印的字符,尝试利用bash中/bin/sh在bash中使用的不符合POSIX的引用),即使printf %q是基线, POSIX(例如/bin/shdash),它变得更有趣了:

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