技术解析

请教一个 pssh 的问题: pssh 执行一个命令的时候,能否包括控制机本身
0
2021-06-21 05:39:43
idczone

我有三台机器,分别为druidcluster1, druidcluster2, druidcluster4,对应 ip 分别为9.116.2.59, 9.116.2.70, 9.116.2.254。其中第一台装了 pssh,拿来当控制机(不知道这个术语准确不- -)。

ssh 互信全都见好了,包括机器和自身的互信:

[[email protected] generalsoftware]# ssh druidcluster1 date
Sun May 12 02:02:49 CDT 2019
[[email protected] generalsoftware]# ssh druidcluster2 date
Sun May 12 02:02:55 CDT 2019
[[email protected] generalsoftware]# ssh druidcluster4 date
Sun May 12 02:03:01 CDT 2019

[[email protected] .ssh]# ssh druidcluster2 date
Sun May 12 02:02:19 CDT 2019
[[email protected] .ssh]# ssh druidcluster1 date
Sun May 12 02:02:25 CDT 2019
[[email protected] .ssh]# ssh druidcluster4 date
Sun May 12 02:02:31 CDT 2019

[[email protected] .ssh]# ssh druidcluster4 date
Sun May 12 02:02:01 CDT 2019
[[email protected] .ssh]# ssh druidcluster1 date
Sun May 12 02:02:08 CDT 2019
[[email protected] .ssh]# ssh druidcluster2 date
Sun May 12 02:02:14 CDT 2019

新建一个记录需要并行执行命令的 host 文件的列表hostpssh,内容如下:

[email protected]
[email protected]
[email protected]

在控制机(也就是druidcluster1)上执行pssh -h hostpssh -P date,期待的结果是三个全成功返回日期的,实际是控制机失败,其他成功。

[[email protected] generalsoftware]# pssh -h hostpssh -P date
[1] 01:33:34 [FAILURE] [email protected] Exited with error code 255
9.116.2.254: Sun May 12 01:33:37 CDT 2019
[2] 01:33:37 [SUCCESS] [email protected]
9.116.2.70: Sun May 12 01:33:37 CDT 2019
[3] 01:33:37 [SUCCESS] [email protected]

所以,是我理解的不对吗?pssh 反而不能在控制机上执行命令?


换个非 root 用户执行试试

试试 ansible 指定本机为 local 就行了

试了一下,还是不行。过程如下:
在控制机上新建一个用户 test,并配置好和其他两台机器的互信。
```
[[email&.ssh]$ ssh [email&date
Sun May 12 05:14:02 CDT 2019
[[email&.ssh]$ ssh [email&date
Sun May 12 05:14:08 CDT 2019
[[email&.ssh]$ ssh [email&date
Sun May 12 05:14:16 CDT 2019
[[email&.ssh]$ ssh [email&date
Sun May 12 05:14:22 CDT 2019
```
修改 hostpssh 文件如下:
```
[[email&.ssh]$ cat ~/hostpssh
[email&/>[email&/>[email&/>```
执行命令,依然是控制机不成功,但是被控机器成功。
```
[[email&.ssh]$ pssh -h ~/hostpssh -P date
[1] 05:14:52 [FAILURE] [email&Exited with error code 255
9.116.2.70: Sun May 12 05:14:54 CDT 2019
[2] 05:14:54 [SUCCESS] [email&/>9.116.2.254: Sun May 12 05:14:54 CDT 2019
[3] 05:14:54 [SUCCESS] [email&/>```

thx,ansible 确实没问题。我就是好奇心起了想着试试 pssh 吧,结果就碰到这个问题了。不过这项目基本已经很久没啥动静了,还是用回 ansible 吧。。。

看下`9.116.2.59`这台机器上的日志? 一般在 /var/log/auth.log.

看了下这个位置没有这个日志文件。不过我看到 audit 那个目录下有个 audit.log 文件, 打开看看是一堆日志,正在找看有没有相关的信息。
```
[[email&log]pwd
/var/log
[[email&log]ll
total 644
drwxr-xr-x. 2 root root 4096 Apr 1 15:02 anaconda
drwx------. 2 root root 4096 Oct 30 2018 audit
-rw-------. 1 root root 0 May 12 03:15 boot.log
-rw-------. 1 root root 17712 May 12 03:15 boot.log-20190512
-rw-------. 1 root utmp 384 May 11 10:20 btmp
drwxr-xr-x. 2 chrony chrony 4096 Apr 12 2018 chrony
-rw-------. 1 root root 904 May 12 05:01 cron
```


看了一下前面说到的 /var/log/audit/audit.log 。当我再次执行一下 pssh 显示 date 命令,依然是控制机失败,两台被控机成功的结果。不过这个文件末尾多了一些内容,其中有一条是失败的信息:
```
type=USER_LOGIN msg=audit(1557657314.113:2468): pid=939 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:sshd_t:s0-s0:c0.c1023 msg='op= login acct="(unknown)" exe="/usr/sbin/sshd" hostname=? addr=9.116.2.59 terminal=ssh res=failed'
```
好像是登陆的问题?

pssh 本身就是在用 python 调用 ssh 命令。
你试试直接 ssh [email&,不用 hostname,看看有什么效果

尝试直接 ssh [email&,发现竟然提示认证问题(类似首次连接时候的认证)。同意之后,再次执行,发现解决了~所以看是还是互信的问题?但是我之前互信确实建好了啊。感谢~总之是解决了。过程如下:
```
[[email&~]ssh [email&date
The authenticity of host '9.116.2.59 (9.116.2.59)' can't be established.
ECDSA key fingerprint is SHA256:V9315377iDHed0ETyHal4dBTUUJ4WopShNjXIW/5giw.
ECDSA key fingerprint is MD5:aa:cc:8d:c5:a4:c1:3c:9b:78:f6:75:e2:48:b5:81:e7.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '9.116.2.59' (ECDSA) to the list of known hosts.
Sun May 12 07:13:27 CDT 2019
[[email&~]/>[[email&~]ssh [email&date
Sun May 12 07:13:33 CDT 2019
[[email&~]/>[[email&~]pssh -h ~/generalsoftware/hostpssh -P date
9.116.2.59: Sun May 12 07:13:45 CDT 2019
[1] 07:13:45 [SUCCESS] [email&/>9.116.2.254: Sun May 12 07:13:47 CDT 2019
[2] 07:13:47 [SUCCESS] [email&/>9.116.2.70: Sun May 12 07:13:47 CDT 2019
[3] 07:13:47 [SUCCESS] [email&/>```

因为你配置文件里面写的是 ip,但是在测试的时候用的是 hostname 啊~

查看了下控制机上的 known_hosts 后,彻底明白了。是因为我用 hostname 建立互信时,对控制机用的内部的 10 开头的 IP,对其他两台被控机,用的是 9 开头的外部 IP。而我的 hostpssh 文件里都是 9 开头的 IP。所以后面在控制机上用 IP 的方式连接控制机一次,写入 known_hosts,就可以了。

pssh 本身就是在用 python 调用 ssh 命令。
让我来谈谈,shell 和 python 组合有几个癌症。shell 本身是面向字符的,shell 调用 py 也不是强类型的。
比如 date,返回的是字符串,无法进行日期计算。
比如没有布尔型变量。计算是否,if 判断困难。
问:那么说,纯 py 就强了么?
答:的确很强。但用起来很不方便。而且经过 ssh 传递的还是字符串。或者说 py 中,远程传递强类型对象看,需要手动序列化,反序列化。
那么,linux 下最强的还是 powershell。请看优势:
1 本地管道之间,能传递对象。shell 不行,而 py 由于不是命令行,没有传统的 shell 管道。或管道用起来很麻烦。
如:
'a' | foreach-object { $_.toupper()}
2 远程能传递对象。不需要手动序列化,反序列化。
3 使用起来和 shell 语法类似。
4 没有 shell 的坑,没有 py 的坑。

运维这一块。
linux 下最强的 shell 脚本语言,还是 powershell。
linux 下最强的 shell 脚本语言,还是 powershell。
linux 下最强的 shell 脚本语言,还是 powershell。

今日格言:
win+bat 界,linux+bash 界,对待 powershell 的态度,就是脚本运维人进步的尺度。
powershell 交+流+群 专门教学 linux 版 powershell,个人免费,公司收费。

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服