V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
BIAOXYZ
V2EX  ›  Linux

请教一个 pssh 的问题: pssh 执行一个命令的时候,能否包括控制机本身

  •  1
     
  •   BIAOXYZ · 2019-05-12 17:03:21 +08:00 · 4497 次点击
    这是一个创建于 2021 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    [root@druidcluster1 generalsoftware]# ssh druidcluster1 date
    Sun May 12 02:02:49 CDT 2019
    [root@druidcluster1 generalsoftware]# ssh druidcluster2 date
    Sun May 12 02:02:55 CDT 2019
    [root@druidcluster1 generalsoftware]# ssh druidcluster4 date
    Sun May 12 02:03:01 CDT 2019
    
    [root@druidcluster2 .ssh]# ssh druidcluster2 date
    Sun May 12 02:02:19 CDT 2019
    [root@druidcluster2 .ssh]# ssh druidcluster1 date
    Sun May 12 02:02:25 CDT 2019
    [root@druidcluster2 .ssh]# ssh druidcluster4 date
    Sun May 12 02:02:31 CDT 2019
    
    [root@druidcluster4 .ssh]# ssh druidcluster4 date
    Sun May 12 02:02:01 CDT 2019
    [root@druidcluster4 .ssh]# ssh druidcluster1 date
    Sun May 12 02:02:08 CDT 2019
    [root@druidcluster4 .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,期待的结果是三个全成功返回日期的,实际是控制机失败,其他成功。

    [root@druidcluster1 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 反而不能在控制机上执行命令?

    第 1 条附言  ·  2019-05-12 20:22:22 +08:00
    补充,问题已解决。看起来症状是这样的:虽然在控制机( druidcluster1 9.116.2.59 )上直接 ssh 连自身和其他两台机器都没问题,参见下图。
    ```
    [root@druidcluster1 generalsoftware]# ssh druidcluster1 date
    Sun May 12 02:02:49 CDT 2019
    [root@druidcluster1 generalsoftware]# ssh druidcluster2 date
    Sun May 12 02:02:55 CDT 2019
    [root@druidcluster1 generalsoftware]# ssh druidcluster4 date
    Sun May 12 02:03:01 CDT 2019
    ```

    但是按照 @knktc 的回复,不用 hostname 直接 ssh [email protected] 却发现出现了添加 known hosts 的提示。yes 确认后,后面就可以同时在三台机器上执行了。
    第 2 条附言  ·  2019-05-12 22:58:51 +08:00

    又仔细看了看,算是彻底弄明白了原因。这边的机器有两套IP,一套对内一套对外。开始使用hostname建立互信的时候,对于控制机本身,在known_hosts文件里添加的是对内的那个IP。

    在下图中可以看到,最开始使用druidcluster1这个hostname去建互信的时候,系统(对本机)默认选用了对内的那个IP地址10.129.203.59(对druidcluster2和druidcluster4还是用9开头的外部IP地址)。最后那个9.116.2.59是我自己(用ssh root@IP的形式)又连了控制机一次以后,添加上了。至此,pssh命令就可以对本机执行了。

    [root@druidcluster1 ~]# cat ~/.ssh/known_hosts
    druidcluster1,10.129.203.59 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzd密钥后面部分省略
    druidcluster2,9.116.2.70 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBGRzuV9cxRVOkDESx3fhMj8pXHa4密钥后面部分省略
    druidcluster3 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBCN7iIherrtnj5b+Ru3zMwicJtjjQc+密钥后面部分省略
    druidcluster4,9.116.2.254 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBBBa2oNjufGaFk6qcmlkcAI/7pq7Kf密钥后面部分省略
    9.116.2.59 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBCN7iIherrtnj5b+Ru3zMwicJtjjQc+密钥后面部分省略
    
    12 条回复    2019-05-14 14:07:20 +08:00
    omph
        1
    omph  
       2019-05-12 17:52:59 +08:00
    换个非 root 用户执行试试
    yangg
        2
    yangg  
       2019-05-12 18:13:43 +08:00 via iPhone
    试试 ansible 指定本机为 local 就行了
    BIAOXYZ
        3
    BIAOXYZ  
    OP
       2019-05-12 18:17:09 +08:00
    @omph 试了一下,还是不行。过程如下:

    在控制机上新建一个用户 test,并配置好和其他两台机器的互信。
    ```
    [test@druidcluster1 .ssh]$ ssh test@druidcluster1 date
    Sun May 12 05:14:02 CDT 2019
    [test@druidcluster1 .ssh]$ ssh root@druidcluster1 date
    Sun May 12 05:14:08 CDT 2019
    [test@druidcluster1 .ssh]$ ssh root@druidcluster2 date
    Sun May 12 05:14:16 CDT 2019
    [test@druidcluster1 .ssh]$ ssh root@druidcluster4 date
    Sun May 12 05:14:22 CDT 2019
    ```

    修改 hostpssh 文件如下:
    ```
    [test@druidcluster1 .ssh]$ cat ~/hostpssh
    [email protected]
    [email protected]
    [email protected]
    ```

    执行命令,依然是控制机不成功,但是被控机器成功。
    ```
    [test@druidcluster1 .ssh]$ pssh -h ~/hostpssh -P date
    [1] 05:14:52 [FAILURE] [email protected] Exited with error code 255
    9.116.2.70: Sun May 12 05:14:54 CDT 2019
    [2] 05:14:54 [SUCCESS] [email protected]
    9.116.2.254: Sun May 12 05:14:54 CDT 2019
    [3] 05:14:54 [SUCCESS] [email protected]
    ```
    BIAOXYZ
        4
    BIAOXYZ  
    OP
       2019-05-12 18:18:55 +08:00
    @yangg thx,ansible 确实没问题。我就是好奇心起了想着试试 pssh 吧,结果就碰到这个问题了。不过这项目基本已经很久没啥动静了,还是用回 ansible 吧。。。
    xiaket
        5
    xiaket  
       2019-05-12 18:20:41 +08:00
    看下`9.116.2.59`这台机器上的日志? 一般在 /var/log/auth.log.
    BIAOXYZ
        6
    BIAOXYZ  
    OP
       2019-05-12 18:27:57 +08:00
    @xiaket 看了下这个位置没有这个日志文件。不过我看到 audit 那个目录下有个 audit.log 文件, 打开看看是一堆日志,正在找看有没有相关的信息。

    ```
    [root@druidcluster1 log]# pwd
    /var/log
    [root@druidcluster1 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
    ```
    BIAOXYZ
        7
    BIAOXYZ  
    OP
       2019-05-12 18:38:22 +08:00
    @xiaket

    看了一下前面说到的 /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'
    ```
    好像是登陆的问题?
    knktc
        8
    knktc  
       2019-05-12 18:56:29 +08:00   ❤️ 1
    pssh 本身就是在用 python 调用 ssh 命令。
    你试试直接 ssh [email protected] ,不用 hostname,看看有什么效果
    BIAOXYZ
        9
    BIAOXYZ  
    OP
       2019-05-12 20:16:28 +08:00
    @knktc 尝试直接 ssh [email protected] ,发现竟然提示认证问题(类似首次连接时候的认证)。同意之后,再次执行,发现解决了~所以看是还是互信的问题?但是我之前互信确实建好了啊。感谢~总之是解决了。过程如下:

    ```
    [root@druidcluster1 ~]# ssh [email protected] 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
    [root@druidcluster1 ~]#
    [root@druidcluster1 ~]# ssh [email protected] date
    Sun May 12 07:13:33 CDT 2019
    [root@druidcluster1 ~]#
    [root@druidcluster1 ~]# pssh -h ~/generalsoftware/hostpssh -P date
    9.116.2.59: Sun May 12 07:13:45 CDT 2019
    [1] 07:13:45 [SUCCESS] [email protected]
    9.116.2.254: Sun May 12 07:13:47 CDT 2019
    [2] 07:13:47 [SUCCESS] [email protected]
    9.116.2.70: Sun May 12 07:13:47 CDT 2019
    [3] 07:13:47 [SUCCESS] [email protected]
    ```
    knktc
        10
    knktc  
       2019-05-12 22:52:57 +08:00 via iPhone
    因为你配置文件里面写的是 ip,但是在测试的时候用的是 hostname 啊~
    BIAOXYZ
        11
    BIAOXYZ  
    OP
       2019-05-12 23:01:48 +08:00
    @knktc 查看了下控制机上的 known_hosts 后,彻底明白了。是因为我用 hostname 建立互信时,对控制机用的内部的 10 开头的 IP,对其他两台被控机,用的是 9 开头的外部 IP。而我的 hostpssh 文件里都是 9 开头的 IP。所以后面在控制机上用 IP 的方式连接控制机一次,写入 known_hosts,就可以了。
    ps1aniuge
        12
    ps1aniuge  
       2019-05-14 14:07:20 +08:00
    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,个人免费,公司收费。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4469 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 10:03 · PVG 18:03 · LAX 02:03 · JFK 05:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.