ssh 远程执行命令
SSH 是 Linux 下进行远程连接的基本工具,但是如果仅仅用它来登录那可是太浪费啦!SSH 命令可是完成远程操作的神器,借助它我们可以把很多的远程操作自动化掉!
配置SSH无密登录
远程执行命令
如果我们要查看一下某台主机的磁盘使用情况,不一定要先登录到目标主机在执行df命令,我们可以使用 ssh 命令在远程的主机上执行 df 命令,然后直接把结果显示出来。整个过程就像是在本地执行了一条命令一样,程序执行完成后当前的主机和位置不会更改。
ssh user@xxx.xxx.xxx.xxx "df -h"
- user user代表的是用户
- xxx.xxx.xxx.xxx 为ip地址,也可以是主机名,前提是你配置了的(/etc/hosts)。
[atguigu@hadoop102 module]$ ssh hadoop103 "df -h"
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 97G 4.2G 88G 5% /
tmpfs 996M 72K 996M 1% /dev/shm
/dev/sda1 190M 39M 142M 22% /boot
[atguigu@hadoop102 module]$
执行多条命令
一次执行多条命令只需要每条命令中间使用分号隔开即可。
ssh user@xxx.xxx.xxx.xxx "pwd; ls -al"
[atguigu@hadoop102 module]$ ssh hadoop103 "pwd; ls -al"
/home/atguigu
总用量 164
drwx------. 27 atguigu atguigu 4096 4月 17 23:51 .
drwxr-xr-x. 4 root root 4096 1月 29 07:23 ..
drwxrwxr-x 2 atguigu atguigu 4096 2月 22 18:20 .abrt
-rw-------. 1 atguigu atguigu 8936 4月 17 07:59 .bash_history
配置Hadoop群起脚本和Zookeeper群起脚本
集群单点启动
由于我配置了群起集群的,我这里写的群起代码就相对少点,具体路径根据自己的修改。
#!/bin/bash
echo "启动hdfs中..."
ssh hadoop102 "/opt/module/hadoop-2.7.2/sbin/start-dfs.sh"
echo -e "\n\n"
echo "启动yarn中..."
ssh hadoop103 "/opt/module/hadoop-2.7.2/sbin/start-yarn.sh"
echo -e "\n\n"
for i in atguigu@hadoop102 atguigu@hadoop103 atguigu@hadoop104
do
echo "---------------------Hadoop$i启动情况---------------------"
ssh $i '/opt/module/jdk1.8.0_144/bin/jps'
echo -e "\n\n"
done
#!/bin/bash
echo "关闭hdfs中..."
ssh hadoop102 "/opt/module/hadoop-2.7.2/sbin/stop-dfs.sh"
echo -e "\n\n"
echo "关闭yarn中..."
ssh hadoop103 "/opt/module/hadoop-2.7.2/sbin/stop-yarn.sh"
echo -e "\n\n"
for i in atguigu@hadoop102 atguigu@hadoop103 atguigu@hadoop104
do
echo "---------------------Hadoop$i jps---------------------"
ssh $i '/opt/module/jdk1.8.0_144/bin/jps'
echo -e "\n"
done
注意配置/home/atguigu目录下的(.bashrc)文件,在其中配置JAVA_HOME,并source /home/atguigu/.bashrc
jps演示:
#!/bin/bash
for i in atguigu@hadoop102 atguigu@hadoop103 atguigu@hadoop104
do
echo "================ $i ================"
ssh $i '/opt/module/jdk1.8.0_144/bin/jps'
done
注:执行命令最好用全路径,不然会找不到命令。
群起Zookeeper演示:
#!/bin/bash
for i in atguigu@hadoop102 atguigu@hadoop103 atguigu@hadoop104
do
echo "================ $i ================"
ssh $i '/opt/module/zookeeper-3.4.10/bin/zkServer.sh start'
done
群起hadoop相关进程脚本:
#!/bin/bash
echo "================ 开始启动所有节点服务 ==========="
echo "================ 正在启动Zookeeper ==========="
for i in atguigu@hadoop102 atguigu@hadoop103 atguigu@hadoop104
do
ssh $i '/opt/module/zookeeper-3.4.10/bin/zkServer.sh start'
done
echo "================ 正在启动HDFS ==========="
ssh atguigu@hadoop102 '/opt/module/hadoop-2.7.2/sbin/start-dfs.sh'
echo "================ 正在启动YARN ==========="
ssh atguigu@hadoop103 '/opt/module/hadoop-2.7.2/sbin/start-yarn.sh'
echo "================ 正在开启JobHistoryServer ==========="
ssh atguigu@hadoop102 '/opt/module/hadoop-2.7.2/sbin/mr-jobhistory-daemon.sh start historyserver'
群关ZK以及hadoop相关进程脚本:
#!/bin/bash
echo "================ 开始关闭所有节点服务 ==========="
echo "================ 正在关闭Zookeeper ==========="
for i in atguigu@hadoop102 atguigu@hadoop103 atguigu@hadoop104
do
ssh $i '/opt/module/zookeeper-3.4.10/bin/zkServer.sh stop'
done
echo "================ 正在关闭HDFS ==========="
ssh atguigu@hadoop102 '/opt/module/hadoop-2.7.2/sbin/stop-dfs.sh'
echo "================ 正在关闭YARN ==========="
ssh atguigu@hadoop103 '/opt/module/hadoop-2.7.2/sbin/stop-yarn.sh'
echo "================ 正在关闭JobHistoryServer ==========="
ssh atguigu@hadoop102 '/opt/module/hadoop-2.7.2/sbin/mr-jobhistory-daemon.sh stop historyserver'
配置在任意目录下执行shell脚本
只需要把脚本移动到当前用户的bin目录下重启即可,比如 /home/atguigu/bin 。
[atguigu@hadoop102 bin]$ cat ~/.bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin
export PATH
简单说PATH就是一组路径的字符串变量,当你输入的命令不带任何路径时,LINUX会在PATH记录的路径中查找该命令。有的话则执行,不存在则提示命令找不到。比如在根目录/下可以输入命令ls,在/usr目录下也可以输入ls,但其实ls命令根本不在这个两个目录下,当你输入ls命令时LINUX会去/bin,/usr/bin,/sbin等目录寻找该命令。而PATH就是定义/bin:/sbin:/usr/bin等这些路劲的变量,其中冒号为目录间的分割符。
如何自定义路径:
假设你新编译安装了一个apache在/usr/local/apache下,你希望每次启动的时候不用敲一大串字符(# /usr/local/apache/bin/apachectl start)才能使用它,而是直接像ls一样在任何地方都直接输入类似这样(# apachectl start)的简短命令。这时,你就需要修改环境变量PATH了,准确的说就是给PATH增加一个值/usr/local/apache/bin。将/usr/local/apache/bin添加到PATH中有三种方法:
1、直接在命令行中设置PATH
PATH=$PATH:/usr/local/apache/bin
使用这种方法,只对当前会话有效,也就是说每当登出或注销系统以后,PATH设置就会失效。
2、在profile中设置PATH
vi /etc/profile
找到export行,在最下面新增加一行,内容为:export PATH=$PATH:/usr/local/apache/bin
注:= 等号两边不能有任何空格。这种方法最好,除非手动强制修改PATH的值,否则将不会被改变。编辑/etc/profile后PATH的修改不会立马生效,如果需要立即生效的话,可以执行source /etc/profile命令。
3、在当前用户的profile中设置PATH
vi ~/.bash_profile
在最下面新增加一行,内容为:export PATH=$PATH:/usr/local/apache/bin
source ~/.bash_profile
让这次的修改生效 source ~/.bash_profile
注:这种方法只对当前用户起作用的,其他用户该修改无效。
去除自定义路径:
当你发现新增路径/usr/local/apache/bin没用或不需要时,你可以在以前修改的/etc/profile或~/.bash_profile文件中删除你曾今自定义的路径。
使用脚本关闭集群
https://blog.csdn.net/qq_40794973/article/details/89414546
#!/bin/bash
for i in atguigu@hadoop104 atguigu@hadoop103 atguigu@hadoop102
do
echo "---------------------$i shutting down---------------------"
ssh $i 'echo "123456" | sudo -S shutdown -h now'
done
参考:
https://www.cnblogs.com/youngerger/p/9104144.html
https://blog.csdn.net/student__software/article/details/81460233