首页 > 系统相关 >Linux Shell远程执行命令

Linux Shell远程执行命令

时间:2024-07-29 23:26:37浏览次数:17  
标签:执行命令 Shell online www 命令 sh ssh Linux 远程

shell远程执行:
        经常需要远程到其他节点上执行一些shell命令,如果分别ssh到每台主机上再去执行很麻烦,因此能有个集中管理的方式就好了。一下介绍两种shell命令远程执行的方法。

 

前提条件:
  配置ssh免密码登陆

对于简单的命令:
  如果是简单执行几个命令,则:

ssh user@remoteNode "cd /home ; ls"
  基本能完成常用的对于远程节点的管理了,几个注意的点:

双引号,必须有。如果不加双引号,第二个ls命令在本地执行
分号,两个命令之间用分号隔开
对于脚本的方式:
  有些远程执行的命令内容较多,单一命令无法完成,考虑脚本方式实现:

#!/bin/bash
ssh user@remoteNode > /dev/null 2>&1 << eeooff
cd /home
touch abcdefg.txt
exit
eeooff
echo done!


远程执行的内容在“<< eeooff ” 至“ eeooff ”之间,在远程机器上的操作就位于其中,注意的点:

<< eeooff,ssh后直到遇到eeooff这样的内容结束,eeooff可以随便修改成其他形式。
重定向目的在于不显示远程的输出了
在结束前,加exit退出远程节点
http://www.cnblogs.com/ilfmonday/p/ShellRemote.html

目录 [隐藏]

1 SSH命令格式
2 主要参数说明
3 ssh控制远程主机,远程执行命令步骤
4 准备工作
5 基于公私钥认证远程登录可能存在的不足
6 ssh 执行远程命令格式
6.1 打开远程shell
7 ssh的-t参数
SSH命令格式
usage: ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec]  
           [-D [bind_address:]port] [-e escape_char] [-F configfile]  
           [-I pkcs11] [-i identity_file]  
           [-L [bind_address:]port:host:hostport]  
           [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]  
           [-R [bind_address:]port:host:hostport] [-S ctl_path]  
           [-W host:port] [-w local_tun[:remote_tun]]  
           [user@]hostname [command]  
主要参数说明
-l 指定登入用户
-p 设置端口号
-f 后台运行,并推荐加上 -n 参数
-n 将标准输入重定向到 /dev/null,防止读取标准输入。如果在后台运行ssh的话(-f选项),就需要这个选项。
-N 不执行远程命令,只做端口转发
-q 安静模式,忽略一切对话和错误提示
-T 禁用伪终端配置
-t (tty)为远程系统上的ssh进程分配一个伪tty(终端)。如果没有使用这个选项,当你在远程系统上运行某条命令的时候,ssh不会为该进程分配tty(终端)。相反,ssh将会把远端进程的标准输入和标准输出附加到ssh会话上去,这通常就是你所希望的(但并非总是如此)。这个选项将强制ssh在远端系统上分配tty,这样那些需要tty的程序就能够正常运行。
-v verbose)显示与连接和传送有关的调试信息。如果命令运行不太正常的话,这个选项就会非常有用。

ssh控制远程主机,远程执行命令步骤
第一步,设置ssh免认证,免认证就是不用密码认证就可以直接登录,这在写脚本服务器控制时特别有用。

每二步,就是到远端服务器上去执行命令

准备工作
基于公私钥认证(可参考:Linux配置SSH密钥登录详解及客户端测试使用无密码登录)或者用户名密码认证(可参考:SSH使用expect自动输入密码、命令实现非交互式密码授权)能确保登录到远程服务器
cmd如果是脚本,注意绝对路径问题(相对路径在远程执行时就是坑)

基于公私钥认证远程登录可能存在的不足
这个可以满足我们大多数的需求,但是通常运维部署很多东西的时候需要root权限,但是有几处限制:
远程服务器禁止root用户登录
在远程服务器脚本里转换身份用expect需要send密码,这样不够安全

ssh 执行远程命令格式
ssh [options] [user@]host [command]
其中,host为想要连接到的OpenSSH服务器(远程系统)的名称,它是惟一的必需参数。host可以是某个本地系统的名称,也可以是因特网上某个系统的FQDN(参见术语表)或者是一个IP地址。命令ssh host登录到远程系统host,使用的用户名与正在本地系统上使用的用户名完全相同。如果希望登录的用户名与正在本地系统上使用的用户名不同,那么就应该包含user@。根据服务器设置的不同,可能还需要提供口令。

打开远程shell
如果没有提供command参数,ssh就会让你登录到host上去。远程系统显示一个shell提示符,然后就能够在host上运行命令。命令exit将会关闭与host的连接,并返回到本地系统的提示符。

例:命令行执行登录并且在目标服务器上执行命令

ssh user@remoteNode "cd /home ; ls"
基本能完成常用的对于远程节点的管理了,几个注意的点:
        如果想在远程机器上连续执行多条命令,可以用单引号或者双引号将这些命令括起来。如果不加单引号或者双引号,第二个ls命令在本地执行。例如 ssh user@node cd /local ls 则 ls 只会执行 cd /local 命令,ls命令在本地执行,加了双引号或者单引号,则被括起来的命令被当做ssh命令的一个参数,所以会在远程连续执行。
分号,两个命令之间用分号隔开

例:在目标服务器上执行批量的命令。

#!/bin/bash  
ssh [email protected]   < < remotessh  
killall -9 java  
cd /data/apache-tomcat-7.0.53/webapps/  
exit  
remotessh  


远程执行的内容在"< < remotessh " 至" remotessh "之间,在远程机器上的操作就位于其中,注意的点:<< remotessh,ssh后直到遇到remotessh这样的内容结束,remotessh可以随便修改成其他形式。在结束前,加exit退出远程节点 如果不想日志文件在本机出现可以修改配置

ssh [email protected] > /dev/null 2>&1   < < remotessh
ssh的-t参数

-t      Force pseudo-tty 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.  


中文翻译一下:就是可以提供一个远程服务器的虚拟tty终端,加上这个参数我们就可以在远程服务器的虚拟终端上输入自己的提权密码了,非常安全
命令格式

ssh -t -p $port $user@$ip  'cmd'  

示例脚本

#!/bin/bash  

#变量定义  

ip_array=("192.168.11.1" "192.168.11.2" "192.168.11.3")  
user="test1"  
remote_cmd="/home/test/1.sh"  

#本地通过ssh执行远程服务器的脚本  

for ip in ${ip_array[*]}  
do  
    if [ $ip = "192.168.11.1" ]; then  
        port="7777"  
    else  
        port="22"  
    fi  
    ssh -t -p $port $user@$ip "remote_cmd"  
done  


例:执行远程后台运行sh
首先把uptimelog.sh修改一下,修改成循环执行的命令。作用是每一秒把uptime写入uptime.log

#!/bin/bash  
  
while :  
do  
  uptime >> 'uptime.log'  
  sleep 1  
done  
  
exit 0


我们需要这个sh在远程服务器以后台方式运行,命令如下:
ssh -l www-online 192.168.11.1 “/home/www-online/uptimelog.sh &”

www-online@onlinedev01:~$ ssh -l www-online 192.168.11.1 "/home/www-online/uptimelog.sh &"  
[email protected]'s password: 
输入密码后,发现一直停住了,而在远程服务器可以看到,程序已经以后台方式运行了。

www-online@nmgwww34:~$ ps aux|grep uptimelog.sh  
1007     20791  0.0  0.0  10720  1432 ?        S    21:25   0:00 /bin/bash /home/www-online/uptimelog.sh
原因是因为uptimelog.sh一直在运行,并没有任何返回,因此调用方一直处于等待状态。
我们先kill掉远程服务器的uptimelog.sh进程,然后对应此问题进行解决。

ssh 调用远程命令后不能自动退出解决方法
可以将标准输出与标准错误输出重定向到/dev/null,这样就不会一直处于等待状态。
ssh -l www-online 192.168.11.1 “/home/www-online/uptimelog.sh > /dev/null 2>&1 &”

www-online@onlinedev01:~$ ssh -l www-online 192.168.11.1 "/home/www-online/uptimelog.sh > /dev/null 2>&1 &"  
[email protected]'s password:  
www-online@onlinedev01:~$  
但这个ssh进程会一直运行在后台,浪费资源,因此我们需要自动清理这些进程。

实际上,想ssh退出,我们可以在ssh执行完成后kill掉ssh这个进程来实现。
首先,创建一个sh执行ssh的命令,这里需要用到ssh的 -f 与 -n 参数,因为我们需要ssh也以后台方式运行,这样才可以获取到进程号进行kill操作。
创建ssh_uptimelog.sh,脚本如下

#!/bin/bash  
  
ssh -f -n -l www-online 192.168.11.1 "/home/www-online/uptimelog.sh &" # 后台运行ssh  
pid=$(ps aux | grep "ssh -f -n -l www-online 192.168.11.1 /home/www-online/uptimelog.sh" | awk '{print $2}' | sort -n | head -n 1) # 获取进程号  

echo "ssh command is running, pid:${pid}"  
sleep 3 && kill ${pid} && echo "ssh command is complete" # 延迟3秒后执行kill命令,关闭ssh进程,延迟时间可以根据调用的命令不同调整  
exit 0  
可以看到,3秒后会自动退出

www-online@onlinedev01:~$ ./ssh_uptimelog.sh  
[email protected]'s password:  
ssh command is running, pid:10141  
ssh command is complete  
www-online@onlinedev01:~$  
然后查看远程服务器,可以见到uptimelog.sh 在后台正常执行。

www-online@nmgwww34:~$ ps aux|grep uptime  
1007     28061  0.1  0.0  10720  1432 ?        S    22:05   0:00 /bin/bash /home/www-online/uptimelog.sh  
查看uptime.log,每秒都有uptime数据写入。

www-online@nmgwww34:~$ tail -f uptime.log  

 

标签:执行命令,Shell,online,www,命令,sh,ssh,Linux,远程
From: https://blog.csdn.net/fanyun_01/article/details/140782902

相关文章

  • Linux系统中常用的文件查看命令
    本章将和大家分享Linux系统中常用的文件查看命令。废话不多说,下面我们直接进入主题。一、cat命令1、文件处理cat命令连接文件并打印到标准输出设备上,cat经常用来显示文件的内容,类似于下的type命令。注意:当文件较大时,文本在屏幕上迅速闪过(滚屏),用户往往看不清所显示的内容。因此......
  • 如何在Arch Linux上构建Raspberry Pi虚拟环境
    如何在Linux上构建RaspberryPi虚拟环境​ 下面我们来讲讲如何使用QEMU来仿照树莓派环境。这里首先先分成两大类。第一类是跑比较老的,安全性较低的老树莓派,主要指代的是22年4月份发布之前的版本,这个版本当中,树莓派镜像自己内部就配置了一份默认的账户密码。对于之后的版本则不配......
  • Linux安装与配置
    下载VMware首先我们需要下载一个叫VMware的软件:进入官方下载,地址:https://www.vmware.com/cn/products/workstation-pro/workstation-pro-evaluation.html选择与自己电脑版本适配的VMware版本【输入许可证密钥MC60H-DWHD5-H80U9-6V85M-8280D】此密钥后续会用到,可以先进......
  • Wordle For Linux 1.0
    把本世纪最伟大的发明移植到LinuxClicktoDownloadWordleForWindows1.2.0使用方法请先解压到/home文件夹下(其他地方也可以,但是你在运行之前必须要先跳到那个文件夹下)然后打开终端,输入以下命令:g++WordleForLinux.cpp-owordle即为编译完成,此后你无需再进行编译,只......
  • Linux常用工具
    Linux常用工具tar打包命令详解tar命令做打包操作当tar命令用于打包操作时,该命令的基本格式为:tar[选项]源文件或目录需要注意的是,在使用tar命令指定选项时可以不在选项前面输入“-”。例如,使用“cvf”选项和“-cvf”起到的作用一样。打包文件和目录......
  • git 、shell脚本
    git文件版本控制 安装gityum-yinstallgit创建仓库将文件提交到暂存gitadd.#将暂存区域的文件提交仓库gitcommit-m"说明"#推送到远程仓库gitpush#获取远程仓库的更新gitpull#克隆远程仓库gitclone#分支,提高代码的灵活性#检查分支gitbranch#......
  • 多队列网卡-虚拟机Linux系统设置
    多队列网卡安装作者使用的是ubuntu20.04,VMWARE首先查看系统上的网卡ipa#查看网卡信息查看ens33是否支持多队列网卡,如果是下图这种情况就是不支持多队列网卡。cat/proc/interrupts|grepens33#proc是linux虚拟文件系统关闭虚拟机,添加多个网卡修改VMWAE......
  • Linux-进程管理
    文章目录 1.进程1.1定义1.2进程和线程的区别:2.静态查看进程3.动态查看进程3.1查看进程3.2杀死进程3.3作业控制总结1.进程1.1定义进程是已启动的可执行程序的运行实例,是程序运行的过程,动态的,有生命周期及运行状态,是一个正在运行的程序,包括主进程和子......
  • Linux-存储管理
    文章目录1.硬盘1.1初识硬盘2.磁盘分区2.1硬盘设备命名2.2磁盘分区方式2.3磁盘分区3.fstab开机自动挂载4.文件系统4.1分类4.2概念5.逻辑卷LVM5.1LVM管理5.2LVM制作5.3逻辑卷扩容5.4逻辑卷缩容6.交换分区7.mount详解8.raid--磁盘阵列8.1RA......
  • 【Linux中Shell的功能】
    一、Shell概念Shell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。Shell是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。Shell编程跟JavaScript、php编程一样,只要有一个......