- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我试图通过 ssh 1-liner 调用在远程机器上运行多个命令,方法是将它们指定为传递给“bash -c”的以分号分隔的字符串。它适用于某些情况,但不适用于其他情况。检查一下:
# Note: the "echo 1" output is lost:
bash-3.2$ ssh sandbox bash -c "echo 1; echo 2; echo 3"
2
3
# Note: first echo is ignored again
bash-3.2$ ssh sandbox bash -c "echo 0; echo 1; echo 2; echo 3"
1
2
3
# But when we run other commands (for example "date") then nothing is lost
bash-3.2$ ssh sandbox bash -c "date; date;"
Wed Nov 7 20:27:55 UTC 3018
Wed Nov 7 20:27:55 UTC 3018
我错过了什么?
远程操作系统:Ubuntu 16.04.5 LTS
远程 ssh:OpenSSH_7.2p2 Ubuntu-4ubuntu2.4,OpenSSL 1.0.2g 2016 年 3 月 1 日
本地操作系统:macOS High Sierra Versoin 10.13.3
本地 ssh:OpenSSH_7.6p1、LibreSSL 2.6.2
更新:上面的示例是我正在尝试做的事情的高度简化图。实际应用实际上是通过回显到远程文件系统来在远程机器上生成几个文件:
#!/bin/bash
A=a
B=b
C=c
ssh -i ~/.ssh/${REMOTE_FQDN}.pem ${REMOTE_FQDN} sudo bash -c \
"echo $A > /tmp/_a; echo $B > /tmp/_b; echo $C > /tmp/_c;"
运行上述脚本并转到远程框检查结果后,我看到以下内容:
root@sandbox:/tmp# for i in `find ./ -name '_*'|sort`; do echo "----- ${i} ----"; cat $i; done
----- ./_a ----
----- ./_b ----
b
----- ./_c ----
c
如您所见,第一个“echo”命令生成了空白文件!
最佳答案
需要明确的是,这里有 3 个 shell 在工作 - 一个解释 ssh,即您的本地 shell; ssh
将自动为您运行的那个,以及您显式调用的 bash
。
1 “消失”的原因是解释 ssh
命令的 shell “吃掉”了 -c
参数周围的引号,然后 shell ssh
的另一 端在空格处拆分参数。所以它最终看起来像 bash -c echo 1 ; echo 2; echo 3
。反过来,-c
只是得到 echo
,它回显一个空行; 1
成为该 shell 的 $1
的值,它未被使用。然后内部bash
返回,直接ssh
shell运行echo 2;正常回显 3
。
考虑一下:
$ ssh xxx bash -c "'echo 1'; echo 2; echo 3"
1
2
3
其中 echo 1
在 ssh 参数中受到保护,因此第二级 ssh shell 被传递 bash -c 'echo 1'; echo 2; echo 3
。最里面的第 3 级 shell 回显 1,然后第 2 层 ssh shell 回显 2 和 3。
这是另一个有趣的排列:
$ ssh xxx bash -c "'echo 1; echo 2; echo 3'"
1
2
3
在这里,内壳获得所有 echo ,因为它们在第一个壳内由 "
分组,在第二个壳内由 '
分组。
通常,将参数传递给运行 shell 脚本的 shell 脚本的 shell 脚本可能非常难以构建。我建议你稍微改变一下你的技术,这样可以省去很多精力。不是将 shell 命令作为命令行参数传递给 ssh
参数,而是通过标准输入将其提供给 shell。考虑使用这样的管道,避免递归 shell 解释:
$ echo "echo 1; echo 2; echo 3" | ssh -T xxx
1
2
3
(这里,-T
只是为了抑制 ssh 提示缺少伪终端)。
关于linux - 远程 ssh 命令 : first echo output is lost,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53197450/
我只是设法与 svn 陷入了一个奇怪的境地。就工作副本而言,我的一个文件似乎“丢失”了。当我查看服务器或在另一个位置重新 check out 包含文件夹时,文件在那里,但在这个特定的工作副本中,它似乎
我使用的是 Delphi 2007。有时链接到组件的属性会丢失。这通常是操作属性和查找数据集。我有几次进行了一些紧急错误修复并向客户发送了一个版本,因此产生了一些灾难性的结果:-)任何人都知道一种方法
我已经安装了 RabbitMQ Bundle。现在这是我想要做的: Controller :创建Redis-List,将消息推送到客户端,然后将消息发送到队列中,因此可以异步执行较重的后台任务。 但我
我在文件中有一个矩阵,例如: 3 1 2 3 4 5 6 7 8 -9 其中第一行表示方阵阶数。我正在使用以下代码读取文件并将其存储到 vector 中(为了简单起见,我删除了所有 if 检查): #
说 Pokemon 是一个类。考虑这个片段: Pokemon Eve(4,3); //call to constructor, creating first object on the stack E
这真的很奇怪。我正在使用 SQL Server Express 2005,并具有以下连接字符串(在 DotNetNuke web.config 中): Data Source=ELECTROMORPH
我有一个包含两个项目的 C# 解决方案:一个服务(主项目)和一个记录器。该服务使用来自记录器的类。我在服务项目中添加了对记录器项目的引用。在设计时,自动完成工作正常:记录器的类是可见的,我使用的引用有
我最近将valgrind与glib(与gobject)一起使用,效果不是很好。 我在命令行中添加了G_SLICE=always-malloc G_DEBUG=gc-friendly, 但是valgri
从 Delphi 2010 升级后,我丢失了 Delphi XE 中的大部分库路径, 现在,即使是一些简单的应用程序也将无法编译。 有什么方法可以恢复库路径中丢失的目录条目吗? 编辑:我发现了一个令人
我最终使用 Eng. 的方法在 JFileChooser 的 JList 和 JComboBoxes 中自定义了选择颜色。福阿德建议here public void customizeJFileCho
我尝试使用返回字符串的 StreamReader 类的 ReadToEnd() 方法读取 JPG 文件。 但出于某种原因,当我将此字符串写入文件时,它无法打开。 将数据读入字符串时是否丢失了什么? 最
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
基本上,我的问题是:是否有某种方法可以“恢复”因向上转换为非泛型基类型而丢失的类型参数,例如 Object .这是我的意思的一个例子: 假设我收到了一个 Object l来自图书馆,我知道 l是一个
我无法让 UIView 通过多次触摸来响应我想要的方式。基本上某些 UITouches 在 UITouchPhaseBegan 中,但永远不会进入 UITouchPhaseEnded 或 UITouc
我面临一个设计问题,我希望只有一个 JMS 生产者向两个消费者发送消息。只有两台服务器,生产者将开始生成消息,这些消息将对两个消费者进行负载平衡(通过循环)。 在假设一台服务器发生故障的情况下,我确实
我正在尝试创建一些程序以便正确地为测试做好准备,这很快就会完成。但实际上,经过几天对这些代码的研究,我无法找到 valgrind 报告的内存泄漏的实际位置。 我尝试释放几乎所有内部和外部指针。我尝
我想使用 Requests 包连接到 Web 服务的流 API。假设我使用以下代码发送请求、接收响应并在响应行到达时对其进行迭代: import requests r = requests.get('
我有一个类,它被另一个类的方法动态扩展。这些方法中还有一些额外的静态信息,例如。例如: class A # @b = B.new # in initialize def a puts
我想对一个变量进行位移并将移出的位存储在 bool 值中。 类似于: unsigned int i = 1; bool b = rshift(&i); // i now equals 0 and b
我有一个超过 18GB 数据的 9000 万条记录的 MYISAM 表,测试表明它是分区的候选者。 原始架构: CREATE TABLE `email_tracker` ( `id` int(11
我是一名优秀的程序员,十分优秀!