详解SSH 远程执行任务的方法

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

远程执行命令

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

$ ssh nick@xxx.xxx.xxx.xxx "df -h"

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

$ ssh nick@xxx.xxx.xxx.xxx "pwd; cat hello.txt"

第一条命令返回的结果: /home/nick

这说明用这种方式执行命令时的当前目录就是登陆用户的家目录。

第二条命令返回 hello.txt 文件的内容。

注意,当命令多于一个时最好用引号括起来,否则在有的系统中除了第一个命令,其它都是在本地执行的。

执行需要交互的命令

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

$ ssh nick@xxx.xxx.xxx.xxx "sudo ls /root"
$ ssh nick@xxx.xxx.xxx.xxx "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 nick@xxx.xxx.xxx.xxx < test.sh

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

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

echo $0
echo $1

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

$ ssh nick@xxx.xxx.xxx.xxx < test.sh helloworld
$ ssh nick@xxx.xxx.xxx.xxx < "test.sh helloworld"

下图显示了执行的结果:

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

$ ssh nick@xxx.xxx.xxx.xxx 'bash -s' < test.sh helloworld

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

执行远程服务器上的脚本

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

ls
pwd

执行下面的命令:

$ ssh nick@xxx.xxx.xxx.xxx "/home/nick/test.sh"

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

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

echo $0
echo $1

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

$ ssh nick@xxx.xxx.xxx.xxx /home/nick/test.sh helloworld

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

总结

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • ssh远程执行命令方法和Shell脚本实例
  • ssh(ssh-keygen)配置免输入密码登录远程主机的方法
  • 关于SSH 远程执行命令你要知道的二三事
  • SSH远程登录和端口转发详解
  • 详解Ubuntu下ssh服务的安装与登陆(ssh远程登陆)
  • ssh远程登陆没有用户名和主机名的解决方法
  • 解决ssh远程登陆linux显示-bash-4.1$的问题
  • 远程SSH连接服务与基本排错经验总结
(0)

相关推荐

  • ssh(ssh-keygen)配置免输入密码登录远程主机的方法

    环境:本地主机:ha01eth0: 192.168.1.100 //对外IP地址 远程主机:ha02eth0: 192.168.1.200 //对外IP地址 本地主机ha01配置: 复制代码 代码如下: [root@ha01 /]# cd /etc/ssh[root@ha01 ssh]# ssh-keygen -t rsa -N "" (该步骤生成key公私密钥对,-N ""表示密钥对短语为空)Generating public/private rsa key pa

  • 详解Ubuntu下ssh服务的安装与登陆(ssh远程登陆)

    Ubuntu默认并没有安装ssh服务,如果通过ssh远程连接到Ubuntu,需要自己手动安装ssh-server. 判断是否安装ssh服务,可以通过如下命令进行: ps -e|grep ssh 输出如下: zht@zht-Ubuntu:~$ ps -e|grep ssh 2151 ? 00:00:00 ssh-agent 5313 ? 00:00:00 sshd ssh-agent表示ssh-client启动,sshd表示ssh-server启动了. 如果缺少sshd,说明ssh服务没有启动或者

  • ssh远程执行命令方法和Shell脚本实例

    写这篇博客之前,我google了一堆相关文章,大都是说修改/etc/sudoers,然后NOPASSWD:指定的cmd,但是真心不管用,没有远程虚拟终端这个方法就是浮云,ubuntu10.04 server 亲测!! ssh执行远程操作 命令格式 复制代码 代码如下: ssh -p $port $user@$p 'cmd'    $port : ssh连接端口号  $user: ssh连接用户名  $ip:ssh连接的ip地址  cmd:远程服务器需要执行的操作 准备工作 基于公私钥认证或者用户

  • 远程SSH连接服务与基本排错经验总结

    为什么要远程连接Linux系统?? 在实际的工作场景中,虚拟机界面或物理服务器本地的窗口都是很少能够接触到的,因为服务器装完系统后,都要拉到IDC机房托管,如果是购买了云主机,更碰不到服务器本地显示器了,此时,只能通过远程连接的方式管理Linux系统.因此,在装好linux系统后,学习Linux运维的第一步应该是配置好客户端软件远程(通过ssh软件进行连接)连接Linux系统进行管理 telnet连接服务器是明文的,非加密的; 默认为23端口 SSH连接服务器是加密的连接; 默认为22端口 ss

  • ssh远程登陆没有用户名和主机名的解决方法

    前言 最近在工作中遇到一个问题,下使用secure crt远程登陆,发现看不到用户名和主机名. 如下图所示 解决方法 sudo vim /etc/passwd root:x:0:0:root:/root:/bin/bash sshd:x:108:65534::/var/run/sshd:/usr/sbin/nologin ftp:x:109:117:ftp daemon,,,:/srv/ftp:/bin/false hadoop:x:1001:0::/home/hadoop: 修改最后一行 ha

  • SSH远程登录和端口转发详解

    介绍 SSH 是创建在应用层和传输层基础上的安全协议,为计算机上的 Shell(壳层)提供安全的传输和使用环境. SSH 只是协议,有多种实现方式,本文基于其开源实现 OpenSSH 远程登录 SSH主要用于远程登录: $ ssh user@host 当本地用户名和远程用户名一致时,可省略用户名: $ ssh host SSH 协议默认端口是22,指定端口可使用 -p 参数 $ ssh -p 2222 user@host MITM SSH 采用公钥加密的方式来保证传输安全.过程如下: 客户端发起

  • 关于SSH 远程执行命令你要知道的二三事

    前言 相信大家在工作的时侯,可能会遇到要利用 ssh 在本地执行远程机器的命令可以便捷地处理某些重复工作,我们希望做到: 免手工输入密码 支持执行多个命令,执行 shell 脚本 支持执行 sudo 的命令 免手工输入密码 我们可以使用 ssh 互信,sshpass 和 expect 等工具来避免手工输密码. 使用过程可能会碰到如下需要手工输入 yes 的繁琐场景: $ ssh username@hostname The authenticity of host ... can't be est

  • 解决ssh远程登陆linux显示-bash-4.1$的问题

    cp -pr /etc/skel/.bash* /home/test/ #/home/test是用户目录 改变用户家目录:usermod -md /tmptest test 以上就是小编为大家带来的解决ssh远程登陆linux显示-bash-4.1$的问题全部内容了,希望大家多多支持我们~

  • 详解SSH 远程执行任务的方法

    SSH 是 Linux 下进行远程连接的基本工具,但是如果仅仅用它来登录那可是太浪费啦!SSH 命令可是完成远程操作的神器啊,借助它我们可以把很多的远程操作自动化掉!下面就对 SSH 的远程操作功能进行一个小小的总结. 远程执行命令 如果我们要查看一下某台主机的磁盘使用情况,是不是必须要登录到目标主机上才能执行 df 命令呢?当然不是的,我们可以使用 ssh 命令在远程的主机上执行 df 命令,然后直接把结果显示出来.整个过程就像是在本地执行了一条命令一样: $ ssh nick@xxx.xxx

  • 详解xshell远程连接自动断开的问题解决办法

    关于用xshell远程连接系统自动断开问题的解决办法: 1.服务器端的配置 我们都知道,作为服务器,默认一般都是被动的等待客户端的连接到来.但对基于ssh协议的xshell的运用,总是出现自动断开的情况. vi命令打开/etc/ssh/sshd_config文件,可以看到: ClientAliveInterval 用来指定服务器向客户端发送消息的时间间隔.默认是0,即不发送. ClientAliveCountMax 用来指定服务器向客户端发送消息的次数.若到达指定的次数,客户端一次也没有回复,那

  • 详解Navicat远程连接mysql很慢

     最终解决办法在最后一张图片 如果你连接远程数据库(Linux系统)并且很慢(具体症状为第一次连接打开所有的表貌似不是很慢,正常的,但是隔几分钟后任意打开一张表就很慢,即时数据很少的表依然很慢),我们用命令找到配置文件(mysql5.7的) sudo vi /etc/my.cnf 此时一般会提示你输入密码,那么你输入密码后,再执行编辑命令 sudo vi /etc/my.cnf 点击键盘insert键此时进入编辑模式,找到对应的位置,把需要配置的(如下)添加进去 [mysqld] #远程连接忽略

  • 详解Java多线程tryLock()方法使用

    tryLock(long time, TimeUnit unit) 的作用在给定等待时长内锁没有被另外的线程持有,并且当前线程也没有被中断,则获得该锁,通过该方法可以实现锁对象的限时等待. package com.wkcto.lock.reentrant; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.ReentrantLock; /** *tryLock(long time, TimeUnit u

  • 详解JS数组Reduce()方法详解及高级技巧

    基本概念 reduce() 方法接收一个函数作为累加器(accumulator),数组中的每个值(从左到右)开始缩减,最终为一个值. reduce 为数组中的每一个元素依次执行回调函数,不包括数组中被删除或从未被赋值的元素,接受四个参数:初始值(或者上一次回调函数的返回值),当前元素值,当前索引,调用 reduce 的数组. 语法: arr.reduce(callback,[initialValue]) callback (执行数组中每个值的函数,包含四个参数) previousValue (上

  • 详解Java中native方法的使用

    今天在网上学习时碰到有关于 native修饰符所修饰的方法,上网查了查,觉得很有意思记录一下 1.native简介 简单地讲,一个Native Method就是一个java调用非java代码的接口.一个Native Method是这样一个java的方法:该方法的实现由非java语言实现,比如C.这个特征并非java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern "C"告知C++编译器去调用一个C的函数. native是与C++联合开发的时候用的!使用nat

  • 详解phpstorm2020最新破解方法

    推荐阅读: PHPStorm2020.1永久激活及下载更新至2020(推荐) https://www.jb51.net/article/195806.htm Jetbrains PhpStorm 2020.1 完美版(附安装教程) https://www.jb51.net/softs/720592.html PHPStorm 是 JetBrains 公司开发的一个轻量级且便捷的 PHP IDE,其旨在提供用户效率,可深刻理解用户的编码,提供智能代码补全,快速导航以及即时错误检查. 没有phpst

  • 详解Navicat简单使用方法

    首先连接上MYSQL数据库. 1.创建数据库:选中连接名,右键,点击新建数据库. 2.删除数据库:选中要删除的数据库,右键,点击删除数据库 3.创建数据表:双击test01,选中表,右键,新建表 4.修改数据表:选中数据表,右键,设计表,然后跟创建表里的操作一样去编辑字段,数据类型,完整性约束等. 5:.删除数据表:选中要删除的数据表,右键,选择删除表. 6.数据的增加.删除和修改: 7.查询数据:双击某个数据库,然后选择查询,右键,新建一个查询,然后就可以在里面编辑查询语句了,保存好这个查询,

  • 详解Java的桥接方法

    什么是桥接方法? Java中的桥接方法(Bridge Method)是一种为了实现某些Java语言特性而由编译器自动生成的方法. 我们可以通过Method类的isBridge方法来判断一个方法是否是桥接方法. 在字节码文件中,桥接方法会被标记为ACC_BRIDGE和ACC_SYNTHETIC,其中ACC_BRIDGE用于表示该方法是由编译器产生的桥接方法,ACC_SYNTHETIC用于表示该方法是由编译器自动生成. 什么时候生成桥接方法? 为了实现哪些Java语言特性会生成桥接方法?最常见的两种

  • 详解Pymongo常用查询方法总结

    Python 直接连接mongodb数据库进行查询操作 1.安装所需模块 使用到的是pymongo模块,安装方法:pip install pymongo 2.环境验证 3.连接数据库 import pymongo def operating_mongodb(): client = pymongo.MongoClient('ip_address', port) db_auth = client.database db_auth.authenticate("username", "

随机推荐