[복각] 원격 명령 실행 원격 명령 실행 SSH를 SSH를

SSH 원격 명령 실행

 
HTTPS : // www.cnblogs.com/youngerger/p/9104144.html

 

SSH는 리눅스에서 원격 연결을위한 필수적인 도구이지만 해당의 로그를 사용하는 경우 너무 많이 낭비! SSH 명령하지만 유물의 완전한 원격 조작은, 아,에 의해 그 중 우리가 멀리 자동화의 원격 조작을 많이 넣을 수 있습니다! 여기서 원격 조작 SSH 작은 합 하였다.

원격 명령 실행

우리는 호스트의 디스크 사용량을보고 싶은 경우에 대상 호스트 그것을 실행 df 명령에 로그인 할 필요가 없다? 당연하지, 우리는 원격 호스트의 SSH 명령 df 명령을 사용할 수 있으며, 그 결과가 바로 표시됩니다. 전체 프로세스는 다음과 같이 로컬로 실행하는 명령어 같다 :

$ ssh를 [email protected] "DF -h"

그렇다면 여러 개의 명령이 한 번 실행합니까? 사실, 아주 간단한 사용 세미콜론 확인에 다른 명령을 분리 :

$ ssh를 [email protected]는 "PWD, 고양이 hello.txt를"

명령에 의해 반환 된 첫 번째 결과 : / 홈 / 닉
이런 식으로 명령을 실행이 쇼 현재 디렉토리는 사용자의 홈 디렉토리에 기록하는 것입니다.
두 번째 명령은 파일 hello.txt의 내용을 반환합니다.
명령은 다른 어떤 시스템에서 국부적으로 수행되며, 하나 이상은 바람직하게는 인용 부호, 또는 제 1 명령에 추가되는 경우, 그 주.

상호 작용에 필요한 명령을 실행

때때로 우리는 원격으로 일부 명령이 상호 작용을 실행해야합니다.

$ ssh를 [email protected] "sudo는 LS / 루트" 
$ ssh를 [email protected] "최고"

이 두 명령, 비록 실패 힌트에 대해 서로 다른 이유, 그러나 그들은 한 가지 공통점 : 모두 사용자와의 상호 작용이 필요 (TTY 필요). 자신의 실패에 대한 이유 그래서 동일합니다 :
기본적으로는 연결하지 않고 명령 SSH를 실행할 때, 당신은 TTY 할당됩니다. 당신이 쉘 세션을 실행하려면 때문에이 시점에서해야합니다.
하지만 당신은 ssh를 통해 원격 호스트에서 명령을 실행하고 원격 세션에 대한 TTY를 할당하지 않는 경우. 명령이 상호 작용도 끝날 때가 필요하므로이 때, ssh를 즉시 원격 호스트를 종료합니다.
다행히도, 우리는 매개 변수를 명시 적으로 ssh를 말할 -t 수 있습니다, 우리는 TTY 원격 상호 작용에 쉘이 필요 해요!
당신이 -t 매개 변수를 추가 한 후, SSH는 사용자가 상호 작용하는 명령의 필요성을 종료 할 때까지 로그인 상태로 유지됩니다.

결론적으로, 우리는 공식 설명 -t 인수를 보면 :
"매우 유용 할 수 있습니다 이것은 실행 임의의 스크린 기반의 프로그램에서 원격 컴퓨터에 사용할 수있는 강제 의사 터미널 할당, EG implementingLearn 때 MENU 여러 서비스 - .. t 옵션 강제 TTY 할당, 경우에도 SSH는 로컬 청각. "가 없습니다
글쎄, 더 강력한 우리가 실제로 여러 매개 변수가 -t 지정할 수 있다는 것입니다!

여러 줄의 명령의 구현

때때로 우리는 간단한 논리의 몇 줄 쓰기 손에해야 할 수도 있습니다,이 문제가되지 않습니다, ssh를 쉽게 얻을 수 있습니다!

당신은 작은 따옴표 나 큰 따옴표로 시작, 다음 명령의 몇 줄 쓰기, 그리고 마지막으로 같은 견적 종료 할 수 있습니다.
명령에 인용 부호를 사용해야 할 경우 어떻게 할까?
사실, 단일 및 이중 따옴표의 혼합물이다 유사한 상황에 대한보다 일반적인 규칙이있다. 이 규칙은 여기에 적용 할 수있다 :

우리는 명령에서 변수를 참조하면 어떻게됩니까?

위의 그림에서 마지막 줄에, 우리는 닉의 출력을 기대하지 않았다 있습니다. 변수가 설명되어 있지 않은 경우, 출력은 $ 될 내 아들 이름을 지정해야하기 때문에 여기에서는 다소 이상하다. 그러나 아무것도 출력이 있었다.
참조 변수의 문구를 들어, 변수가 올바른 해석이 있는지 확인하기 위해 다음과 같은 방법을 사용할 수 있습니다 :

우리가 차트에 명령 bash는 -c 매개 변수를 지정합니다.

원격 스크립트

복잡한 기능이 몇 가지 명령을 실행할 수 있습니다 만, 일부 장면을 완료하려면, 다음, 단순히 약한 버스트입니다. 우리는 임무를 수행하기 위해 긴 쉘 스크립트를 작성해야 할 수도 있습니다! SSH는이 시간에 임무는 여전히 좋은 도우미입니다 수행 (하, 하, 단지 전채 아의 내용의 앞에!).

지역 실행 스크립트

우리는 로컬 스크립트 파일 test.sh을 만들 말한다 :

LS의 
PWD

그런 다음 명령을 실행합니다 :

ssh를 [email protected] <test.sh $

표준 입력을 리디렉션하여, 지역 test.sh 스크립트는 원격 서버에서 실행됩니다.

나는 두 줄을 추가 test.sh 파일의 끝에 전달 된 매개 변수를 확인하기 위해, 우리의 다음 패스 앞으로 스크립트 test.sh에 매개 변수를 찾습니다

에코 $ 0 
에코 $ (1)

그리고 다음 명령을 실행하려고 :

$ ssh를 [email protected] <test.sh helloworld를 
$ ssh를 [email protected] < "test.sh helloworld를"

다음 그림의 실행의 결과를 나타낸다 :

위의 방법은 스크립트에 매개 변수를 전달할 수 없습니다 보인다.
(스크립트의 로컬 원격 실행) 매개 변수를 사용하여 스크립트를 실행하려면이 경우 배쉬에 -s 매개 변수를 지정해야합니다 :

ssh를 [email protected] 'bash는 -s'<test.sh helloworld를 $

在上图的最后两行,输出的是 "bash" 和 "helloworld" 分别对应 $0 和 $1。

执行远程服务器上的脚本

除了执行本地的脚本,还有一种情况是脚本文件存放在远程服务器上,而我们需要远程的执行它!
此时在远程服务器上用户 nick 的家目录中有一个脚本 test.sh。文件的内容如下:

ls
pwd

执行下面的命令:

$ ssh [email protected] "/home/nick/test.sh"

注意,此时需要指定脚本的绝对路径!

下面我们也尝试为脚本传递参数。在远程主机上的 test.sh 文件的末尾添加两行:

echo $0
echo $1

然后尝试执行下面的命令:

$ ssh [email protected] /home/nick/test.sh helloworld

真棒,最后两行 "/home/nick/test.sh" 和 "helloworld" 分别对应 $0 和 $1。

总结

本文通过 demo 演示了 ssh 远程操作的基本方式。这些基本用法将为我们在更复杂的场景中完成各种艰巨的任务打下基础。

SSH 是 Linux 下进行远程连接的基本工具,但是如果仅仅用它来登录那可是太浪费啦!SSH 命令可是完成远程操作的神器啊,借助它我们可以把很多的远程操作自动化掉!下面就对 SSH 的远程操作功能进行一个小小的总结。

远程执行命令

如果我们要查看一下某台主机的磁盘使用情况,是不是必须要登录到目标主机上才能执行 df 命令呢?当然不是的,我们可以使用 ssh 命令在远程的主机上执行 df 命令,然后直接把结果显示出来。整个过程就像是在本地执行了一条命令一样:

$ ssh [email protected] "df -h"

那么如何一次执行多条命令呢?其实也很简单,使用分号把不同的命令隔起来就 OK 了:

$ ssh [email protected] "pwd; cat hello.txt"

第一条命令返回的结果: /home/nick
这说明用这种方式执行命令时的当前目录就是登陆用户的家目录。
第二条命令返回 hello.txt 文件的内容。
注意,当命令多于一个时最好用引号括起来,否则在有的系统中除了第一个命令,其它都是在本地执行的。

执行需要交互的命令

有时候我们需要远程执行一些有交互操作的命令。

$ ssh [email protected] "sudo ls /root"
$ ssh [email protected] "top"

这两条命令虽然提示的失败原因不同,但它们有一个共同点:都需要与用户交互(需要 TTY)。所以它们失败的原因也是相同的:
默认情况下,当你执行不带命令的 ssh 连接时,会为你分配一个 TTY。因为此时你应该是想要运行一个 shell 会话。
但是当你通过 ssh 在远程主机上执行命令时,并不会为这个远程会话分配 TTY。此时 ssh 会立即退出远程主机,所以需要交互的命令也随之结束。
好在我们可以通过 -t 参数显式的告诉 ssh,我们需要一个 TTY 远程 shell 进行交互!
添加 -t 参数后,ssh 会保持登录状态,直到你退出需要交互的命令。

作为总结,我们看看 -t 参数的官方解释:
"Force pseudo-terminal allocation.  This can be used to execute arbitrary screen-based programs on a remote machine, which can be very useful, e.g. when implementing menu services.  Multiple -t options force tty allocation, even if ssh has no local tty."
好吧,更强悍的是我们居然可以指定多个 -t 参数!

执行多行的命令

有时候我们可能需要随手写几行简单的逻辑,这也没有问题,ssh 能轻松搞定!

你可以用单引号或双引号开头,然后写上几行命令,最后再用相同的引号来结束。
那么如果需要在命令中使用引号该怎么办?
其实针对类似的情况有一条比较通用的规则,就是混合使用单双引号。这条规则在这里也是适用的:

当我们在命令中引用了变量时会怎么样呢?

请注意上图中的最后一行,并没有输出我们期望的 nick。这里多少有些诡异,因为如果变量没有被解释的话,输出的应该是 $name 才对。但是这里却什么都没有输出。
对于引用变量的写法,可以通过下面的方式保证变量被正确解释:

注意,我们在上图的命令中为 bash 指定了 -c 参数。

远程执行脚本

对于要完成一些复杂功能的场景,如果是仅仅能执行几个命令的话,简直是弱爆了。我们可能需要写长篇累牍的 shell 脚本去完成某项使命!此时 SSH 依然是不辱使命的好帮手(哈哈,前面的内容仅仅是开胃菜啊!)。

执行本地的脚本

我们在本地创建一个脚本文件 test.sh,内容为:

ls
pwd

然后运行下面的命令:

$ ssh [email protected] < test.sh

通过重定向 stdin,本地的脚本 test.sh 在远程服务器上被执行。

接下来我们我期望能为脚本 test.sh 传递一个参数,为了验证传入的参数,在 test.sh 文件的末尾添加两行:

echo $0
echo $1

然后尝试执行下面的命令:

$ ssh [email protected] < test.sh helloworld
$ ssh [email protected] < "test.sh helloworld"

下图显示了执行的结果:

看来上面的方法都无法为脚本传递参数。
要想在这种情况下(远程执行本地的脚本)执行带有参数的脚本,需要为 bash 指定 -s 参数:

$ ssh [email protected] 'bash -s' < test.sh helloworld

在上图的最后两行,输出的是 "bash" 和 "helloworld" 分别对应 $0 和 $1。

执行远程服务器上的脚本

除了执行本地的脚本,还有一种情况是脚本文件存放在远程服务器上,而我们需要远程的执行它!
此时在远程服务器上用户 nick 的家目录中有一个脚本 test.sh。文件的内容如下:

ls
pwd

执行下面的命令:

$ ssh [email protected] "/home/nick/test.sh"

注意,此时需要指定脚本的绝对路径!

下面我们也尝试为脚本传递参数。在远程主机上的 test.sh 文件的末尾添加两行:

echo $0
echo $1

然后尝试执行下面的命令:

$ ssh [email protected] /home/nick/test.sh helloworld

真棒,最后两行 "/home/nick/test.sh" 和 "helloworld" 分别对应 $0 和 $1。

总结

本文通过 demo 演示了 ssh 远程操作的基本方式。这些基本用法将为我们在更复杂的场景中完成各种艰巨的任务打下基础。

추천

출처www.cnblogs.com/jinanxiaolaohu/p/12090874.html