对于简单的命令:
ssh user@remoteNode "cd /home ; ls"
注意
**1.**双引号,必须有。如果不加双引号,第二个ls命令在本地执行
**2.**分号,两个命令之间用分号隔开
对于脚本的方式:
#!/bin/bash
ssh user@remoteNode > /dev/null 2>&1 << eeooff
cd /home
ls
exit
eeooff
echo done!
远程执行的内容在“<< eeooff ” 至“ eeooff ”之间,在远程机器上的操作就位于其中,注意的点:
1. ssh执行<< eeooff后的命令直到遇到eeooff这样的内容结束,eeooff可以随便修改成其他形式。
**2.**重定向目的在于不显示远程的输出了。
**2.**在结束前,加exit退出远程节点。
shell脚本解释
在Linux系统中0 1 2是一个文件描述符
0 标准输入 stdin 键盘
1 标准输出 stdout 屏幕
2 标准错误输出 stderr 屏幕
我们在简单地用<或>时,相当于使用 0< 或 1>
关于2>&1的含义
含义:将标准错误输出重定向到标准输出
符号>&是一个整体,不可分开,分开后就不是上述含义了。
比如有些人可能会这么想:2是标准错误输入,1是标准输出,>是重定向符号,那么"将标准错误输出重定向到标准输出"是不是就应该写成"2>1"就行了?是这样吗?如果是尝试过,你就知道2>1的写法其实是将标准错误输出重定向到名为"1"的文件里去了
考虑如下一条shell命令
ssh user@remoteNode > /dev/log 2>&1
为什么2>&1一定要写到>log后面,才表示标准错误输出和标准输出都定向到log中?
不妨把1和2都理解是一个指针,然后来看上面的语句就是这样的:
**1.**本来1----->屏幕 (1指向屏幕)
**2.**执行>log后, 1----->log (1指向log)
**3.**执行2>&1后, 2----->1 (2指向1,而1指向log,因此2也指向了log)
再来分析下
ssh user@remoteNode 2>&1 > /dev/log
**1.**本来1----->屏幕 (1指向屏幕)
**2.**执行2>&1后, 2----->1 (2指向1,而1指向屏幕,因此2也指向了屏幕)
**3.**执行>log后, 1----->log (1指向log,2还是指向屏幕)
所以这就不是我们想要的结果。
关于<< eeooff的含义
cmd << text
...
...
...
text
从命令行读取输入,直到遇到与text相同的行结束。
参考:
https://www.cnblogs.com/softidea/p/6855045.html
https://blog.csdn.net/zhaominpro/article/details/82630528
https://zhidao.baidu.com/question/196553141.html