Linux学习笔记(九)——su_sudo_ssh_pdsh命令

一、   su命令

建议不要使用root账户直接登录系统,主要考虑的是系统安全问题。通常的做法是使用su命令切换到root账户,完成需要的工作。如果su命令没有任何参数,默认登录的就是root账户,输入密码后会启动一个root用户的进程。su可以使一般用户拥有超级用户或其他用户的权限,也可以使超级用户以一般用户的身分执行命令。但一般用户使用该命令时必须输入root用户或其他用户的口令。执行exit命令退出当前用户的登陆。

执行su命令切换到root用户的PATH环境变量值:


[[email protected]  yarn]# echo $PATH

/usr/lib/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/yarn/bin

执行su–命令切换到root用户的PATH环境变量值:


[[email protected]  ~]# echo $PATH

/usr/lib/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

1.1           su命令的常用方法

使用su命令切换用户主要有两种方式,这两种方式略有不同,命令格式如下:

下面这种方式切换用户后,环境变量不是全部改变,如LOGNAME,登录用户名称,所以不是正真意义上的登录。


su

su root

su yarn

下面的方式会发生正真的登录,环境变量全部会更新。


su -

su -l

su --login

su - root

su - yarn

su -l yarn

对于su命令,常用的方式是切换用户执行某个命令,当命令执行结束后立即返回当前用户,通常是root用户切换到其他普通用户,使用普通用户的权限执行命令,当命令执行结束后立即返回当前root用户,原因是root用户转换成普通用户不需要输入普通用户的密码,常在脚本中使用,如下命令格式:


su - yarn -c "cd  /home/yarn ; cp /mnt/hgfs/share/jdk*.gz /home/yarn"

参数-c后面跟着命令,注意:命令要使用双引号。

二、   sudo命令

在普通用户没有权限执行某个命令时,通常的做法是使用su命令,切换到root权限完成

操作,但是这样存在的问题是,当多个用户都使用root权限时,存在系统安全问题,很难确定某个用户的具体操作。另外,在编写脚本时,如果遇到普通用户不具备的权限时,就需要使用root用户的权限,在这种情况下,通过su命令输入密码的方式就无法实现了。对于上面两个问题的解决办法是使用sudo命令。

2.1           sudo的特点

sudo命令可以使用root用户或者其他用户的身份执行命令,但是需要在/etc/sudoers文件中进行配置,此文件只有root用户有权限进行编辑,如果没有在/etc/sudoers文件中配置,在使用sudo命令时会提示警告信息,另外要输入使用sudo命令的用户的密码。


[[email protected]  ~]$ sudo mkdir /usr/local/syslog

We trust you have received the usual  lecture from the local System

Administrator. It usually boils down to  these three things:

#1) Respect the privacy of others.

#2) Think before you type.

#3) With great power comes great responsibility.

[sudo]  password for yarn:

yarn 不在 sudoers 文件中。此事将被报告。

[[email protected] ~]$

配置sudo命令的使用权限必须编辑/etc/sudoers文件,此文件只有root用户才可以修改,并且建议使用visudo命令进行编辑。为什么要使用visudo命令进行编辑有两个原因,一是防止两个有root权限的用户同时修改。二是语法检查。所以建议用visudo命令来编辑/etc/sudoers文件。

root用户使用visudo命令打开/etc/sudoers文件:


## Allow root to run any commands  anywhere

root    ALL=(ALL)       ALL

可以看到root用户拥有所有的权限,只有将使用sudo命令的用户添加到下面就可以了,如将yarn用户添加到配置文件中。


## Allow root to run any commands  anywhere

root    ALL=(ALL)       ALL

yarn    ALL=(ALL)       ALL

配置完成后,保存退出,yarn用户就有了使用sudo命令执行所有命令的权限。


[[email protected] ~]$ sudo mkdir /usr/local/syslog

[sudo]  password for yarn:

[[email protected] ~]$ cd /usr/local

[[email protected] local]$ ls

bin   games    lib      man        sbin    src     vmware-tools-distrib

etc   include  libexec  pdsh-2.26   share  syslog

当然,可以通过配置文件/etc/suduers限制用户执行sudo命令的权限,如有通过sudo执行某些命令的权限,而不是所有命令的权限,如下设置:用户yarn只能在NameNode主机上执行mkdir命令和touch命令。

在/etc/sudoers文件只设置创建目录和创建文件的权限:


## Allow root to run any commands  anywhere

root     ALL=(ALL)       ALL

yarn    NameNode=/bin/mkdir,/bin/touch

下面测试用户yarn使用sudo命令的权限:


[[email protected] local]$ sudo mkdir /usr/local/syslogs

[sudo]  password for yarn:

[[email protected] local]$ ls

bin   games    libexec  pdsh-2.26   share  syslogs

etc   include  lib          man      sbin       src     vmware-tools-distrib

[[email protected] local]$ sudo touch /usr/local/syslogs/syslog.log

[[email protected] local]$ cd /usr/local/syslogs

[[email protected]  syslogs]$ ls

syslog.log

[[email protected]  syslogs]$ sudo rm -f syslog.log

对不起,用户 yarn 无权以 root 的身份在 NameNode 上执行 /bin/rm -f syslog.log

对sudo命令配置说明,第一列是使用sudo命令的用户名称,如果不在此文件中配置就没有使用sudo命令的权限。第二列是用户有权使用sudo命令的主机名称,如果是ALL,说明在所有的主机上都可以使用sudo命令,也可以指定特定的主机,如果要指定多个主机,需要使用逗号分隔。第三列小括号中的ALL代表可以以所有用户的身份执行命令,也可以指定特定的用户,如果是多个用户可以使用逗号分隔。第四列是有权使用sudo命令执行的命令,要使用命令的全路径,如果不使用全路径存在安全问题,因为有同名的脚本,使用root权限执行某个同名的脚本,对系统存在安全隐患。如果是ALL有权执行所有的命令,也可以指定特定的命令,如果是多个命令要使用逗号分隔。


root     ALL=(ALL)       ALL

yarn    NameNode,DataNode1=(hadoop)      /bin/mkdir,/bin/touch

如果就一台服务器单一的主机,只要配置主机上的/etc/sudoers文件就可以了,如果是集群,就需要在每个主机上对/etc/sudoers文件进行配置,在特定的主机上用户可以通过sudo命令执行特定的命令。如果在所有的主机上用户的权限都相同,只需要在一台主机上进行配置,然后将此文件拷贝到其他主机上就可以了,可以使用pscp命令,后面的内容会涉及到。

将NameNode主机上配置好的/etc/sudoers文件拷贝到DataNode1主机上。


[[email protected]  ~]# pdcp -w DataNode1 "/etc/sudoers"  "/etc/sudoers"

另外,sudo命令不可以使用ssh命令直接远程执行,ssh命令后面的内容会说明,这里只是简单的介绍。要先使用ssh命令远程到要执行sudo命令的主机上,然后在执行sudo命令,如下例子。


[[email protected]  ~]$ ssh DataNode1 "sudo mkdir  /usr/local/syslogs"

sudo:抱歉,您必须拥有一个终端来执行 sudo

[[email protected] ~]$ ssh DataNode1

Last login: Thu Oct 27 11:10:40 2016 from  192.168.230.153

[[email protected]DataNode1 ~]$ sudo mkdir  /usr/local/syslogs

[sudo]  password for yarn:

[[email protected]  ~]$

下面的例子是用户yarn使用hadoop用户的身份执行命令,注意:在执行sudo命令是要使用参数-u来指定使用的用户名称。

下面的配置是用户yarn在NameNode主机上可以使用hadoop用户的身份执行指定的命令。


root     ALL=(ALL)       ALL

yarn    NameNode=(hadoop)      /bin/mkdir,/bin/touch

修改配置文件后,yarn用户只能使用hadoop用户的身份执行后面设置的命令,下面执行命令:


[[email protected] local]$ sudo mkdir /usr/local/syslogs

[sudo]  password for yarn:

对不起,用户 yarn 无权以 root 的身份在 NameNode 上执行 /bin/mkdir /usr/local/syslogs

当执行命令时,系统提示警告信息,所以要使用参数-u来执行执行命令的用户身份,如下方式,但是需要注意的是执行命令创建文件的权限还要受到hadoop用户的权限限制:


[[email protected] local]$ sudo -u hadoop mkdir /home/hadoop/data

[[email protected] local]$ cd /home/hadoop

-bash:  cd: /home/hadoop: 权限不够

[[email protected] local]$ su hadoop

密码:

[[email protected] local]$ cd /home/hadoop

[[email protected] ~]$ ls

data

[[email protected] ~]$

需要注意的是每次执行sudo命令都要使用参数-u来指定用户身份,默认情况下指定的是root用户的身份。可以在/etc/sudoers配置文件中进行默认身份用户设定,设定完成后执行sudo命令时就不需要使用参数-u了,如下设置:


## Allow root to run any commands anywhere

root     ALL=(ALL)       ALL

yarn     NameNode=(hadoop)        /bin/mkdir,/bin/touch

Defaults:yarn  runas_default=hadoop


[[email protected] local]$ sudo mkdir /home/hadoop/dir

[sudo]  password for yarn:

[[email protected] local]$ su hadoop

密码

[[email protected]  local]$ cd

[[email protected] ~]$ ll

总用量 8

drwxr-xr-x.  2 hadoop hadoop 4096 10月 27 12:08 data

drwxr-xr-x.  2 hadoop hadoop 4096 10月 27 12:15 dir

在上面的例子中,每次执行sudo命令都需要输入执行sudo命令的用户的密码,这很不方便,如在脚本中使用某个用户的身份执行命令时就无法输入密码,可以进行配置在执行sudo命令时不需要输入用户密码,需要在配置文件中添加NOPASSWD关键字,如下配置:


## Allow root to run any commands  anywhere

root     ALL=(ALL)       ALL

yarn     NameNode=(root) NOPASSWD:       /bin/mkdir,/bin/touch

上面的配置是yarn用户可以在NameNode主机上使用root用户的身份执行两个命令,但是不需要输入执行sudo命令的用户yarn的密码,如下测试。


[[email protected]  ~]$ sudo mkdir /usr/local/syslogs

[[email protected]  ~]$ cd /usr/local

[[email protected] local]$ ls

bin   games    libexec  pdsh-2.26   share  syslogs

etc   include  lib          man      sbin       src     vmware-tools-distrib

需要注意的是,使用visudo命令对/etc/sudoers文件进行配置时,如果语法错误保存退出时会有提示信息到控制台,如下信息:


visudo:>>> /etc/sudoers:syntax error 在行 99 附近<<<

现在做什么?

键入e是重新编辑/etc/sudoers文件,键入x是不保存退出,键入Q是保存并退出。如果语法错误没有修改保存并退出,那么sudo将不会再运行,直到错误被纠正。

通常情况下用户执行sudo命令要记录日志,用于检查某个用户执行了什么命令在哪台主机上等信息。但是sudo命令的日志记录不是自动创建的,需要root用户配置并启动。

使用root用户权限在/etc/sudoers文件中进行配置,如下:


## Allow root to run any commands  anywhere

root     ALL=(ALL)       ALL

yarn     NameNode=(root) NOPASSWD:       /bin/mkdir,/bin/touch

##配置sudo命令默认日志文件

Defaults  logfile=/var/log/sudo

测试日志文件记录的sudo命令的执行信息:


[[email protected] local]$ sudo mkdir /usr/local/syslogs

mkdir:  无法创建目录"/usr/local/syslogs": 文件已存在

[[email protected] local]$ sudo mkdir /usr/local/syslog

...

[[email protected] log]# cat sudo

Oct  27 14:22:33 : yarn : TTY=pts/0 ; PWD=/usr/local ; USER=root ;

    COMMAND=/bin/mkdir /usr/local/syslogs

Oct  27 14:22:48 : yarn : TTY=pts/0 ; PWD=/usr/local ; USER=root ;

    COMMAND=/bin/mkdir /usr/local/syslog

配置sudo日志文件后,普通用户执行的sudo命令都会记录日志,root用户可以查看日志文件,知道那个用户执行了什么命令,主要是为了系统安全。日志文件只有root有查看权限。

三、   SSH免认证登录

SSH(secureshell),是一个系统管理工具,能够让用户访问远程计算机上的Shell进程,并且可以执行各种命令,SSH使用加密通道来传输网络数据,使用加密技术确认访问用户的身份,并且可以将主机间的通信加密,可以有效防止陌生主机的网络攻击。

单机模式下是没有Hadoop守护进程,所以不需要配置SSH。在伪分布式和完全分布式情况下必须启动Hadoop守护进程,然而启动Hadoop守护进程的前提是已经成功安装了SSH。Hadoop运行过程中需要登录启动远程节点上的Hadoop守护进程,也就是说NameNode是通过SSH来启动和停止各个DataNode上的各种守护进程的。这就必须在节点之间执行指令的时候无需输入密码,因此需要安装配置SSH,这样NameNode使用SSH无密码登录并启动其它节点上的DataNode进程。

3.1           安装SSH工具软件

首先检查系统是否已经安装下面的软件,如果没有安装,需要进行安装。

用下面的命令查看系统是否安装了SSH服务和RSYNC服务


rpm -qa | grep openssh

rpm -qa | grep rsync

rsync是远程数据同步工具,可以同步多台主机间的文件。

如果没有安装两个服务,采用下面命令安装,但是安装需要连接外网。

安装命令是:


yum install ssh

yum install rsync

3.2           NameNode无密码登录DataNode1

在Hadoop启动阶段,NameNode节点需要连接到远程所有的数据节点DataNode上来启

动数据节点的守护进程。需要在NameNode上生成一个密钥对,包括一个公钥和一个私

钥,要将公钥复制到所有的DataNode节点上。当NameNode通过SSH服务连接DataNode

时,DataNode就会生成一个随机数并用NameNode的公钥对随机数进行加密,并发送给

NameNode。NameNode收到加密后的字符串后再用私钥解密,并将解密后的字符串回传

给DataNode,DataNode确认无误之后就允许NameNode进行连接了。这就是一个公钥

认证过程,不需要用户手工输入密码。

3.2.1    在NameNode上生成密码对

Linux系统上哪个用户配置SSH无密码登录,其他用户是不能共享的,所以,如果需要多个用户都实现SSH无密码登录远程机器,那么这些用户都有生成密码对并且进行配置。在我们的例子中,root用户需要远程复制安装软件,将多台机器同步安装配置软件,所以root用户需要配置SSH无密码登录认证,而启动Hadoop服务需要使用yarn用户,所以yarn用户也需要进行配置SSH无密码登录认证。

集群中所有的节点目录结构必须相同,具有相同的用户。注意:使用yarn用户和root用户分别生成密码对,命令如下:


ssh-keygen -t rsa

ssh-keygen  -t rsa -f ~/.ssh/id_rsa

注意:在生成密码对的过程中,问是否设置密码和文件生成目录,直接回车,不设置密码。使用root用户和yarn用户将生成的密码公钥复制到要远程登录的DataNode上,文件目录默认。命令如下:


ssh-copy-id  -i /root/.ssh/id_rsa.pub DataNode1

ssh-copy-id  -i /home/yarn/.ssh/id_rsa.pub DataNode1

ssh-copy-id  -i /root/.ssh/id_rsa.pub localhost

ssh-copy-id  -i /home/yarn/.ssh/id_rsa.pub localhost

注意:将生成的公钥复制到数据节点上需要对/etc/hosts文件进行配置,将所有的数据节点的ip和主机名按行进行配置,需要root用户权限,命令如下:


vi  /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4  localhost4.localdomain4

::1         localhost localhost.localdomain  localhost6 localhost6.localdomain6

192.168.230.153  NameNode

192.168.230.154  DataNode1

还可以采用下面的方式,但是没有上面的方式简洁。


ssh-keygen  -t rsa -f ~/.ssh/id_rsa

scp  ~/.ssh/id_rsa.pub [email protected]:~/

cat  ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

chmod  600 ~/.ssh/authorized_keys

chmod  700 ~/.ssh

3.3           SSH远程常用方法

3.3.1    连接到远程主机

可以通过ssh命令远程到其他主机,前提是配置了SSH无密码认证,通过下面的命令直接远程到其他主机上进行命令操作。ssh命令后面可以跟IP地址或者主机名称,但是主机名称和IP的对应需要在/etc/hosts文件中进行配置。


[[email protected]  local]#  ssh DataNode1

Last  login: Wed Oct 26 17:55:44 2016 from 192.168.230.153

[[email protected] ~]# pwd

/root

[[email protected] local]$ ssh DataNode1

Last  login: Wed Oct 26 18:28:38 2016 from 192.168.230.1

[[email protected]  ~]$ pwd

/home/yarn

[[email protected]  local]# ssh [email protected]

Last  login: Wed Oct 26 19:39:38 2016 from 192.168.230.153

[[email protected]  local]# ssh [email protected]

Last  login: Wed Oct 26 19:49:01 2016 from 192.168.230.153

[[email protected]  local]# ssh [email protected]

[email protected]‘s password:

通过ssh命令远程其他主机,一旦认证成功,将会为用户返回一个shell连接。

3.3.2    SSH服务的默认端口号

SSH服务器默认在端口22上运行。如果SSH服务器指定的是其他的端口号。可以使用-p参数进行指定端口号,如下方式。


[[email protected]  local]# ssh DataNode1 -p 22

Last login: Wed Oct 26 19:49:29 2016 from  192.168.230.153

[[email protected] ~]#

3.3.3    在当前主机执行远程命令

可以在当前主机中执行远程命令,命令格式如下:


ssh 主机名 | [email protected]主机名 | [email protected] "命令"

ssh 主机名 | [email protected]主机名 | [email protected] "命令"

如下例子:


[[email protected] local]# ssh DataNode1 "echo OK"

OK

[[email protected] local]# ssh DataNode1 "echo $USER"

yarn

[[email protected]  local]#

如果想要在远程机器上一次执行多条命令,命令要用分号分隔,注意:命令要使用双引号,如下例子:


[[email protected]  local]# ssh DataNode1 "cd  /home/yarn ; mkdir logs ; cd logs ; touch syslog.log"

[[email protected]  local]# ssh DataNode1 "cd  /home/yarn ; rm -rf logs"

[root[email protected]  local]#

3.3.4    在脚本中使用SSH

可以在脚本中使用ssh命令,如:在集群中所有的机器上创建日志目录,并在目录中创建日志文件,首先,我们先创建一配置文件,用来保存集群中所有的主机名称或IP地址。

主机配置文件hosts,文件内容如下,注意:每个主机名称占用一行。


NameNode

DataNode1

脚本createLogs.sh:


#!/bin/bash

# 使用ssh命令为所有的主机创建日志文件

for  line in `cat hosts`

do

echo "开始为主机:$line创建日志目录和日志文件..."

ssh $line "cd /usr/local ; mkdir logs  ; cd logs ; touch syslog.log"

done

~

脚本执行会使用ssh命令远程创建目录和文件。

四、   pdsh概述

以搭建一个Hadoop集群为例,通常情况下多台机器具有有同样的配置,同样的目录结构,如:JDK的安装目录和环境变量配置文件,Hadoop的安装目录和配置文件。通过手工配置效率较低。

pdsh是一个开源的工具,可以在多个远程机器上并行执行命令,pdsh的全称是paralleldistributed shell(并行的分布式Shell)。pdsh主要用于大批量服务器的配置、部署、文件复制等操作。在使用pdsh远程操作时,需要配置本地主机和远程主机间的ssh无密码登录服务。另外,pdsh还附带了pdcp命令,此命令可以将本地文件批量复制到远程的多台主机上,在搭建集群环境时是非常有用。

pdsh可以通过多种方式在远程主机上运行命令,默认是rsh方式,另外也支持ssh、mrsh、qsh、mqsh、krb4、xcpu等多种rcmd模块,这个可以在运行命令时通过参数指定。我们指定ssh服务为远程登录服务。

4.1           pdsh安装

我们还是将pdsh工具安装到/usr/local目录下,当然也可以是其他目录,如果/opt目录等等。首先将pdsh安装包pdsh-2.26.tar.bz2从共享文件夹拷贝到/usr/local目录下,注意:拷贝安装过程必须使用root用户权限。


cd /usr/local

su

cp /mnt/hgfs/share/pdsh/pdsh-2.26.tar.bz2  .

使用root权限在/usr/local目录下解压文件:


tar -jxvf pdsh-2.26.tar.bz2

解压完成后,生成一个目录pdsh-2.26,进入目录中,分别指向下面三条命令,注意:安装pdsh工具软件需要使用c编译器gcc,如果没有安装,pdsh不能安装成功,需要首先安装gcc编译器。

检查系统是否安装了gcc编译器:


[[email protected] ~]$ rpm -qa | grep gcc

gcc-4.4.7-17.el6.i686

libgcc-4.4.7-17.el6.i686

如果没有安装gcc-4.4.7-17.el6.i686要首先安装,安装过程需要外网,安装命令如下:


yum install gcc

 

   安装过程需要几分钟时间,直到命令行提示符出现,可以在执行上面的rpm命令检查是否安装成功。gcc安装成功后,就可以安装pdsh工具软件了,按照下面的命令顺序执行。


cd pdsh-2.26

./configure --with-ssh --without-rsh  --with-machines=/etc/pdsh/machines

make

make install

在执行configure脚本时,“--with-ssh”参数表示启用ssh模块,而“--with-dshgroups”表示启用主机组支持,启用此参数后,就可以将一组主机列表写入一个文件并放到~/.dsh/group或/etc/dsh/group目录下,然后通过pdsh的“-g”参数进行调用。最后的参数“--with-machines”是“--with-dshgroups”参数的扩展,通过将所有要管理的主机列表都写入指定的/etc/pdsh/machines文件中,接着通过pdsh的“-a”参数调用,最终完成所有主机的便捷管理。

检测是否安装成功,使用下面的命令。


pdsh -v

如果显示使用信息,说明安装成功。

4.2           pdsh基本命令

4.2.1    pdsh命令

在一个集群中,从一台主机上可以通过ssh命令远程到其他主机上执行命令,如果集群机器很多,可以通过在脚本中使用ssh命令的方式执行,但是ssh命令还是有局限的,如一台机器执行结束后另一台机器才能开始执行,而pdsh命令可以并行在多台机器上同时执行相同的命令,当然pdsh底层使用的还是ssh或其他的远程方式,如rsh等等。

pdsh命令格式:


pdsh [-参数选项] 命令

下面将pdsh命令常用参数进行举例说明。

参数-h:显示pdsh命令的使用说明:


[[email protected]  ~]$ pdsh -h

Usage:  pdsh [-options] command ...

-S                return largest of remote  command return values

-h                output usage menu and quit

-V                output version information  and quit

-q                list the option settings and  quit

-b                disable ^C status feature  (batch mode)

-d                enable extra debug information  from ^C status

-l  user           execute remote commands  as user

-t  seconds        set connect timeout  (default is 10 sec)

-u  seconds        set command timeout (no  default)

-f  n              use fanout of n nodes

-w host,host,...  set  target node list on command line

-x  host,host,...  set node exclusion list  on command line

-R  name           set rcmd module to name

-M  name,...       select one or more misc  modules to initialize first

-N                disable hostname: labels on  output lines

-L                list info on all loaded modules and  exit

-g  groupname      target hosts in dsh  group "groupname"

-X  groupname      exclude hosts in dsh  group "groupname"

-a                target all nodes

available  rcmd modules: ssh,exec (default: ssh)

参数-w:指定要执行的远程主机,可以指定多个,每个主机用逗号隔开,可以是主机名也可以是IP地址。


[[email protected]  ~]$ pdsh -w NameNode,DataNode1  "cd /home/yarn ; mkdir data"

[[email protected]  ~]$ pdsh -w 192.168.230.153,192.168.230.154 "cd /home/yarn ; mkdir  data"

通常的做法是,将主机名称配置到文件中,因为主机很多的情况下,采用上面的方式命令会很长。上面的命令方式适合对单一的远程主机进行操作。下面采用配置文件的方式实现上面命令的功能。

主机配置文件hosts:


NameNode

DataNode1

或者采用主机IP地址的方式:


192.168.230.153

192.168.230.154

注意:将hosts文件放在执行pdsh命令的目录下,如:在/home/yarn目录下创建一个目录job,将hosts文件拷贝到job目录下,在job目录下执行pdsh命令。


pdsh -w ^hosts "cd /home/yarn ; mkdir data"

查看主机上的IP和主机名称:


[[email protected]  job]$ pdsh -w ^hosts "echo  $HOSTNAME"

192.168.230.153: NameNode

192.168.230.154: NameNode

[[email protected]  job]$

参数-R:指定远程工具名称,pdsh默认是rsh,我们在安装pdsh时已经重新指定了ssh,当然可以使用-R参数重新指定。


pdsh -w ^hosts -R  ssh "cd /home/yarn ; mkdir data"

参数-a:通过-a参数可以指定所有的远程主机,在pdsh命令中使用此参数,pdsh默认会查看/etc/pdsh/目录下的machines文件中的主机列表,目录名称和文件名称在执行configure脚本时可以修改,通过“--with-machines”参数进行指定。


./configure --with-ssh --without-rsh --with-machines=/etc/pdsh/machines

我们就以默认情况举例,首先使用root用户权限在/etc目录下创建pdsh目录,在此目录下创建文件machines文件,文件中是主机名称,一行一个,也可以使用IP地址,保存后退出。


su

cd /etc

mkdir pdsh

cd pdsh

vi machines

NameNode

DataNode1

:wq

执行pdsh命令:


[[email protected]  ~]$ pdsh -a "cd /home/yarn ;  touch pdsh"

命令执行后会在两个主机上创建文件pdsh,当使用-a参数时,就不需要使用-w参数,系统会从/etc/pdsh目录下读取machines文件中的主机名称执行命令。

参数-x: 此参数和-w参数功能正好相反,用来指定不执行命令的多个或单个主机,使用方式如-w参数。

采用主机名称的方式,NameNode主机执行命令,DataNode1主机不执行命令:


[[email protected]  ~]$ pdsh -w NameNode -x DataNode1 "cd  /home/yarn ; touch syslogs"

如果要是有多个主机执行命令,多个主机除外,可以采用配置文件的形式,还是上面的例子,将NameNode写入hosts1文件,DataNode1写入hosts2文件,以下面的方式执行。


[[email protected] job]$ echo NameNode > hosts1

[[email protected] job]$ echo DataNode1 > hosts2

[[email protected]  job]$ cat hosts1

NameNode

[[email protected]  job]$ pdsh -w ^hosts1 -x ^hosts2  "cd /home/yarn ; touch file"

4.2.2    pdcp命令

如果配置整个集群,要求所有的机器安装相同的软件,如果逐一拷贝效率较低,通常的做法是将所有要安装的软件拷贝到一台主机上,通过pdcp命令同步拷贝到其他机器上。pdcp命令格式:


pdcp [-参数] “源文件1” [源文件2...]  目标

下面将pdcp命令常用参数进行举例说明,参数的用法和pdsh命令大多相同。

参数-w:指定要拷贝文件的远程主机,多个主机用逗号隔开,可以是主机名也可以是IP地址。


[[email protected]  ~]$ pdcp -w DataNode2 "syslogs" "/home/yarn"

也可以将主机名称或IP写入到一个配置文件,使用方式如pdsh命令。


[[email protected]  ~]$ pdcp -w ^hosts "syslogs" "/home/yarn"

如果拷贝的是一个目录,需要加上参数-r。


[[email protected]  ~]$ pdcp -w ^hosts -r  "job" "/home/yarn"

需要注意的是,pdcp命令后面是两个或多个参数,要用空格分隔,建议将参数使用双引号。

参数-x和-w正好相反,用法与pdsh命令相同。


$ pdcp  -w DataNode2 -x NameNode "job/hosts1"  "job/hosts2" "/home/yarn"

参数-a的用法与pdsh命令相同,要在/etc/pdsh/machines文件中配置主机名称或IP地址,因为pdcp命令会读取此文件的主机信息。


[[email protected]  ~]$ pdcp -a "sys"  "/home/yarn"

4.2.3    使用pdsh工具为集群所有的主机安装配置JDK

首先要在所有的主机上安装pdsh工具软件,如果只使用pdsh命令,其他主机不需要安装pdsh软件,但是pdcp命令需要目标主机也安装pdsh软件才能拷贝成功。下面的例子是集群安装JDK并配置环境变量。

首先将JDK安装包拷贝到NameNode主机上,因为JDK要安装在/usr/local目录下,这个目录只有root用户采用权限,所以脚本的执行者是root用户,这是通用的做法。在root用户的工作目录/root下创建一个目录job,将JDK安装包和脚本文件都放置在这个目录下,同样,主机名称配置文件也放置在这个目录下。


# yarn用户登录,然后切换成root用户

su

# 进入到root用户的工作目录

cd  /root

# 创建job目录

mkdir  job

# 进入到job目录

cd job

# 将JDK文件拷贝到当前目录

cp  /mnt/hgfs/share/jdk*.gz .

# 编辑主机配置文件

vi hosts

NameNode

DataNode1

:wq

# 编辑执行脚本

vi  install_jdk.sh

install_jdk.sh脚本:


#!/bin/bash

# 在NameNode主机上执行的脚本,将JDK安装包先拷贝到各个数据节点上的/usr/local目录下

# 然后在各节点使用tar命令安装JDK,安装完成将JDK安装包删除,然后在/etc/prfile.d目录下配置JDK环境变量

# 安装配置完成后,执行

jdk="jdk-8u51-linux-i586.tar.gz"

jdkpath="/usr/local"

JAVA_HOME="$jdkpath/jdk1.8.0_51"

JRE_HOME="$jdkpath/jdk1.8.0_51/jre"

echo "删除JDK相关软件包..."

pdsh -w ^hosts "rpm -e --nodeps  tzdata-java-2012j-1.el6.noarch" 2>/dev/null

pdsh -w ^hosts "rpm -e --nodeps  java-1.6.0-openjdk-1.6.0.0-1.50.1.11.5.el6_3.i686" 2>/dev/null

pdsh -w ^hosts "rpm -e --nodeps  java-1.7.0-openjdk-1.7.0.9-2.3.4.1.el6_3.i686" 2>dev/null

echo "拷贝$jdk到数据节点..."

pdcp -w ^hosts $jdk $jdkpath

echo "在各节点安装$jdk..."

pdsh -w ^hosts "tar -xzf $jdkpath/$jdk -C  $jdkpath/"

echo "删除各节点上的$jdk安装包..."

pdsh -w ^hosts "rm -f $jdkpath/$jdk"

echo "配置JDK环境变量..."

pdsh -w ^hosts "echo export  JAVA_HOME=$jdkpath/jdk1.8.0_51 >> /etc/profile.d/java.sh"

pdsh -w ^hosts "echo export  JRE_HOME=$jdkpath/jdk1.8.0_51/jre >> /etc/profile.d/java.sh"

pdsh -w ^hosts "echo export  PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH >> /etc/profile.d/java.sh"

pdsh -w ^hosts "echo export  CLASS_PATH=.:$JAVA_HOME/lib:$JRE_HOME/lib >>  /etc/profile.d/java.sh"

pdsh -w ^hosts "source  /etc/profile.d/java.sh"

需求:将NameNode主机和DataNode1主机上的JDK卸载,环境变量文件删除。

时间: 2024-10-13 07:46:07

Linux学习笔记(九)——su_sudo_ssh_pdsh命令的相关文章

Linux学习笔记之sed命令

讷于言而敏于行    --<论语·里仁> sed命令是一个用在对输入流进行处理的文本处理工具.掌握它能够更好地帮助管理Linux和处理日志文件. 用法: sed [option] 'command' 输入流 常用option: -n:安静模式,一般如果没有加-n选项,输入流中所有的行将会被列出,加入-n后只会列出'command'处理过的行.一般与 command中p命令连用. -r:默认sed只是支持一般的正则表达式,如果加上-r参数表示让sed支持扩展的正则表达式. -i:插入,如果输入流

linux学习笔记23--时间命令date和cal

在linux环境中,不管是编程还是其他维护,时间是必不可少的,也经常会用到时间的运算,熟练运用date命令来表示自己想要表示的时间,肯定可以给自己的工作带来诸多方便. 1.命令格式: date [参数]... [+格式] 2.命令功能: date 可以用来显示或设定系统的日期与时间. 3.命令参数: 必要参数: %H 小时(以00-23来表示). %I 小时(以01-12来表示). %K 小时(以0-23来表示). %l 小时(以0-12来表示). %M 分钟(以00-59来表示). %P AM

LInux学习笔记之常用命令

以下命令主要是平时用到的命令,对于一些经常用到的,就收集资料,归纳一下. 指令目录: 1.yum 2.wget 3.tar 1.yum命令: yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器.基於RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载.安装.yum提供了查找.安装.删除某一个.一组甚至全部软件包的命令,

Linux学习笔记(三)-Shell命令机制

切换命令行:ctrl+alt+f1-f6 切换到图形界面:ctrl+alt+f7 ls-list(win下的dir) 白色:普通文件 蓝色:目录文件 绿色:可执行文件 执行步骤: 输入ls 在相关目录下去找命令程序(path,环境变量:/etc/environment),whereis+命令:查找该命令的可执行文件的位置 基于shell的基本类库Bash 底层的交互 GNU,FSF,Bash,Coreutils 来自为知笔记(Wiz)

Linux学习笔记之——基础命令学习

1.find 按照名字查找:find / -name file_name 2.zip压缩 1) 我想把一个文件repartition.txt和一个目录invader压缩成为amateur.zip: # zip -r amateur.zip repartition.txt invader 2)我下载了一个aptly.zip文件,想解压缩: # unzip aptly.zip 3)我当前目录下有abc1.zip,abc2.zip和abc3.zip,我想一起解压缩它们: # unzip abc\?.z

linux学习笔记30--网络命令ifconfig

许多windows非常熟悉ipconfig命令行工具,它被用来获取网络接口配置信息并对此进行修改.Linux系统拥有一个类似的工具,也就是ifconfig(interfaces config).通常需要以root身份登录或使用sudo以便在Linux机器上使用ifconfig工具.依赖于ifconfig命令中使用一些选项属性,ifconfig工具不仅可以被用来简单地获取网络接口配置信息,还可以修改这些配置.用ifconfig命令配置的网卡信息,在网卡重启后机器重启后,配置就不存在.要想将上述的配

Linux学习笔记之grep命令及sed 命令相关选项

#grep  强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来. 根据模式,搜索文本 ,并将符合模式的文本行显示出来,常与正则表达式相结合使用. [[email protected] ~]# grep --h 用法: grep [选项]... PATTERN [FILE]... 在每个 FILE 或是标准输入中查找 PATTERN. 默认的 PATTERN 是一个基本正则表达式(缩写为 BRE). 例如: grep -i 'hello world' menu.h main.c

Linux学习笔记——文本管理命令及相关选项

文本处理: cut  echo  sort  uniq  wc tr 文本查看: cat tac  more less tail head 文本处理 #cut   文本输出 [[email protected] ~]# cut --help 用法:cut [选项]... [文件]... Print selected parts of lines from each FILE to standard output. Mandatory arguments to long options are m

马哥linux学习笔记:htop命令使用详解

htop工具在centos官方yum源仓库中是不提供的,但在epel的yum源仓库中是有的,所以我们可以通过源码编译安装htop,也可以设置epel的yum源来用yum命令安装htop,设置epel的yum源方法为: 首先,下载epel官方网站提供的rpm包,然后安装,就可以设置epel的yum源直接使用了: centos6: wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm centos7:

Linux学习笔记&lt;一&gt;——常用命令

CLI(Command Line Interface)中的命令格式: 命令 选项 参数 command options... arguments... 选项:短选项:-character 多个选项可以组合,如-a -b=-ab 长选项:--word 参数:命令的作用对象 控制类型: 通过虚拟终端:Ctrl+Alt+F1-F6 通过终端模拟器:在GUI中点击打开的终端 通过Telnet或SSH远程接入 GUI(Graphical User Interface)和CLI(Command Line I