[再印刷]コマンドのSSHリモート実行は、リモートコマンドの実行をsshを

sshのリモートコマンドの実行

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

 

SSHは、Linuxでのリモート接続のための不可欠なツールですが、あなただけのは、あまりにもそれを無駄にすることをログに記録するためにそれを使用する場合!SSHコマンドが、我々は離れて、自動化の遠隔操作の多くを置くれる手段により、アーティファクトの完全な遠隔操作、ああ、!ここでは、遠隔操作用のSSHは少額でした。

リモートコマンドの実行

我々はホストのディスク使用量を見たい場合は、ターゲットホスト上でそれを実行するためにdfコマンドにログインする必要はありませんか?もちろんない、我々は、リモート・ホストでsshコマンドdfコマンドを使用することができ、その結果を直接表示されます。全体のプロセスは、としてローカルに実行するコマンドのようなものです:

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

それでは、どのようにそれ一度に複数のコマンドを実行しますか?実際には、非常に単純な、セミコロンを使用してOKに異なるコマンドを分離:

$のssh [email protected] "PWD;猫hello.txt"

コマンドによって返される最初の結果:/ホーム/ニック
、このようにコマンドを実行し、このショーカレントディレクトリがユーザのホームディレクトリにログインすることです。
2番目のコマンドは、ファイルhello.txtの内容を返します。
コマンドは、1つは、好ましくは、引用符で囲まれた、または最初のコマンドに加えて、他のISは、いくつかのシステムでローカルに実行以上であることに留意されたいです。

対話する必要がコマンドを実行

時々、私たちは相互作用を有するリモートでいくつかのコマンドを実行する必要があります。

$ sshの[email protected] "はsudo LS /ルート" 
$ sshの[email protected] "トップ"

この2つのコマンド、ものの失敗ヒントのための別の理由が、彼らは一つの共通点を持っている:両方がユーザーとの対話を必要とする(TTYが必要)。その失敗の理由だから同じです:
デフォルトでは、あなたは接続せずに、コマンドのsshを実行するとき、あなたはTTYが割り当てられます。あなたはシェルセッションを実行したいので、この時点で、あなたはする必要があります。
しかし、あなたは、SSH経由でリモートホスト上でコマンドを実行し、リモートセッションのためにTTYを割り当てていない場合。コマンドは対話にも終わりが来る必要ですので、この時点では、sshはすぐに、リモートホストを終了します。
幸いなことに、我々は、パラメータが明示的に、我々は対話するTTYリモートシェルを必要とし、SSHを伝える-tすることができます!
あなたは-tパラメータを追加した後、sshはあなたが対話するためのコマンドの必要性を終了するまでにログインしたままになります。

結論として、我々は公式の説明-t引数を見て:
「非常に役立ちます。これは、実行し、任意の画面ベースのプログラムON Aリモートマシンに使用することができフォース疑似端末割り当て、EG implementingLearnときMENU複数のサービス- .. Tオプション力のtty割り当て、場合でも、 sshはローカル端末を持っていません。」
まあ、より強力な、我々は実際には複数のパラメータは-t指定することができるということです!

複数行のコマンドの実装

時々、私たちは単純な論理の数行を書く手に必要がある場合があり、これは問題ありません、sshは簡単に得ることができます!

あなたは、単一または二重引用符で始まり、その後、コマンドの数行を書き、そして最終的には同じ引用符で終了することができます。
だから、あなたが行う方法コマンドで引用符を使用する必要がある場合は?
実際には、単一引用符と二重引用符の混合物である似たような状況のためのより一般的なルールがあります。このルールはここに適用されます。

私たちは、コマンド内の変数を参照する場合はどうなりますか?

上図の最後の行は、我々はニックの出力を期待していなかったことに注意してください。変数が説明されていない場合、出力は私の息子に名前を付ける$でなければなりませんので、ここでは、やや奇妙です。しかし、何も出力がありました。
参照変数の文言について、あなたは変数が正しい解釈であることを確認するために、次の方法を使用することができます。

私たちは、チャート上のコマンドではbash -cのパラメータを指定することに注意してください。

リモートスクリプト

いくつかのシーンを完了するために複雑な機能のために、それはいくつかのコマンドを実行することができる場合にのみ、そして、それは単に弱いバーストです。私たちは使命を達成するために長いシェルスクリプトを記述する必要があるかもしれません!SSHは、この時点で使命を果たすまだ良いヘルパーです(ちょうど前菜のAHの内容の前に、ハハ!)。

ローカル実行スクリプト

私たちは、ローカルスクリプトファイルtest.shを作成し、こう述べています。

LS 
PWD

そして、次のコマンドを実行します。

$ sshの[email protected] <test.sh

標準入力をリダイレクトすることによって、ローカルtest.shスクリプトは、リモート・サーバ上で実行されます。

私は2つの行を追加しtest.shファイルの最後に渡されたパラメータを検証するために、スクリプトtest.shに私たちの次のパスパラメータを楽しみにして:

エコー$ 0 
$ 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 远程操作的基本方式。这些基本用法将为我们在更复杂的场景中完成各种艰巨的任务打下基础。

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