Python中如何编写一个简单的Mac SSH连接工具并分享

因为总是用 ssh 连接需要不断的输密码,找过工具,可能是自己姿势不对,觉得不太好使。

SecureCRT 不知道是我装的不对还是别的什么原因,总是会过一会儿就连接中断。

所以用 Python 基于 expect 写了个简单的工具。

atssh

# 安装
bash build.sh ~/.zshrc

使用

atssh IP USERNAME PASSWORD PORT

首次连接

atssh 192.168.1.99 root root 22

再次连接

atssh 192.168.1.99

atssh


Python中如何编写一个简单的Mac SSH连接工具并分享

48 回复

确定是你姿势不对 其实在 bashrc 或者 zshrc 那边加配置能搞定


要写一个简单的Mac SSH连接工具,用Python的paramiko库最直接。先装库:pip install paramiko

下面是个基础版本,支持密码和密钥认证:

import paramiko
import sys

def ssh_connect(hostname, username, password=None, key_filename=None, port=22):
    """
    建立SSH连接并打开交互式shell
    """
    client = paramiko.SSHClient()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    
    try:
        if key_filename:
            # 使用密钥认证
            client.connect(hostname, port=port, username=username, key_filename=key_filename)
        else:
            # 使用密码认证
            client.connect(hostname, port=port, username=username, password=password)
        
        print(f"成功连接到 {hostname}")
        
        # 打开交互式shell
        shell = client.invoke_shell()
        print("进入交互模式,输入'exit'退出")
        
        while True:
            # 接收服务器输出
            if shell.recv_ready():
                output = shell.recv(1024).decode('utf-8')
                sys.stdout.write(output)
                sys.stdout.flush()
            
            # 发送用户输入
            if sys.stdin in select.select([sys.stdin], [], [], 0)[0]:
                user_input = sys.stdin.readline()
                if user_input.strip().lower() == 'exit':
                    break
                shell.send(user_input)
    
    except paramiko.AuthenticationException:
        print("认证失败,请检查用户名/密码或密钥")
    except paramiko.SSHException as e:
        print(f"SSH连接错误: {e}")
    except Exception as e:
        print(f"连接失败: {e}")
    finally:
        client.close()
        print("\n连接已关闭")

if __name__ == "__main__":
    # 使用密码连接
    ssh_connect("192.168.1.100", "your_username", password="your_password")
    
    # 或使用密钥连接
    # ssh_connect("192.168.1.100", "your_username", key_filename="/path/to/private_key")

如果想做成可分享的工具,可以加个配置文件:

import json
import os

CONFIG_FILE = "ssh_config.json"

def save_connection(name, hostname, username, password=None, key_path=None, port=22):
    """保存连接配置"""
    config = {}
    if os.path.exists(CONFIG_FILE):
        with open(CONFIG_FILE, 'r') as f:
            config = json.load(f)
    
    config[name] = {
        "hostname": hostname,
        "username": username,
        "password": password,
        "key_path": key_path,
        "port": port
    }
    
    with open(CONFIG_FILE, 'w') as f:
        json.dump(config, f, indent=2)
    
    print(f"已保存配置: {name}")

def load_connections():
    """加载所有保存的连接"""
    if not os.path.exists(CONFIG_FILE):
        return {}
    
    with open(CONFIG_FILE, 'r') as f:
        return json.load(f)

# 使用示例
save_connection("服务器1", "192.168.1.100", "user", password="pass123")
save_connection("服务器2", "10.0.0.5", "admin", key_path="~/.ssh/id_rsa")

connections = load_connections()
print("可用连接:", list(connections.keys()))

要分享的话,创建requirements.txt:

paramiko>=3.0.0

再写个简单的命令行界面:

import argparse

def main():
    parser = argparse.ArgumentParser(description="简单的SSH连接工具")
    parser.add_argument("hostname", help="目标主机地址")
    parser.add_argument("username", help="用户名")
    parser.add_argument("-p", "--password", help="密码")
    parser.add_argument("-k", "--key", help="私钥文件路径")
    parser.add_argument("--port", type=int, default=22, help="端口号")
    
    args = parser.parse_args()
    ssh_connect(args.hostname, args.username, args.password, args.key, args.port)

if __name__ == "__main__":
    main()

这样就能通过命令行调用了:python ssh_tool.py 192.168.1.100 username -p password

总结:用paramiko库快速实现SSH功能,加个配置文件管理多个连接。

断线的问题也可以通过 配置搞定 里面一个发送心跳包的设置 以前也是自己姿势不对……

为什么不用 key 验证要用密码验证呢?

key 登录就好了,这需求奇怪的。

用 key 啊大哥

。。。。。

用 key 最好,而且加个 alias 不也能搞定吗

aws 经常不知因为啥操作 key 就不能用了

ssh-copy-id

alias 是比较常见的做法,一个脚本就能搞定的事情

[aws 经常不知因为啥操作 key 就不能用了], 怎么可能…只用 key 登陆 aws 的路过,前天才登过一次。

是啊,一直都是正常的,某一天就不能用了,我也很绝望啊…用 aws 官网终端也登不上

mac 下最好 ssh 连接工具是 Termius

放着 ssh-key 认证不用,这是何苦?你 macOS 哪个版本?

macos 自己的 key-chain 会在第一次使用 key 登陆时,把 id_rsa/private_key 的 passphrase 给加密保存下来,
之后只要 macos 通过你自己 mac 的账密登陆,就自动给 private_key 解锁,并加入 ssh-agent,
这时终端下直接 ssh 登录放过 public-key 的主机,丝般流畅。

macOS 在 10.12 时更改过 ssh 客户端的默认设定,你要确保你的 ~/.ssh/config 里得有以下:
ForwardAgent yes
UseKeychain yes
AddKeysToAgent yes

才好使。

额,那应该是我的姿势不对了,很尴尬…

ssh-key 啊

就算有限制不能用 key,也可以配置 ssh-confg,使链接持久化,这样再次登录时也不用输入密码了

我回头试试

不是 iTerm2 么?

SecureCRT 有个 Anti-idle

iterm2+sshpass

SecureCRT 有个 Anti-idle 的配置,勾选 Send NO-OP 就可以保持连接了。

试一下 mosh 吧, 你会爱上它的

推荐 Termius

iTerm + expect 脚本,不让贴连接

学到了, 我一直都是直接改 config 的路径…

key 搞定,在 user 目录建一个 .ssh 文件夹(应该都有),再建一个 config 文件 ,里边儿写上 name,host,post 就可以了

iTerm2 只是个终端阿,又不是 ssh 管理连接工具

连 key 都不知道,写出了 ssh 连接工具,只能 hehe 了。

#29 谁不是小白过来的。

用 key,配置 config,直接用别名登录,都不需要记这些。

貌似深度终端有这个工具来着。。

用 key 登入,然后如下设置下 .ssh/config 就行了

Host *
UseKeychain yes
AddKeysToAgent yes
IdentityFile ~/.ssh/id_rsa

Host [whatever]
HostName [IP address]
Port 12345
User root
ServerAliveInterval 10

ssh 可以加一个选项 -o,表示配置自动活跃,令 SSH 连接不会因为长时间无输入自动断掉。
比如:

<br>ssh user@host -o ServerAliveInterval=60<br>

鉴于折腾可能是无止境的,老夫这里有一份折腾小册子,少侠可以拿去作为参考:

『分享』打通终端到服务器,我推荐它们 https://hit1024.com/post/2016-10-30

内容是关于这些工具的使用和简单配置:iTerm,Zsh,mosh,SSH public-key authentication,Tmux。

SecureCRT 里面有一项设置 隔多少秒发数据包给服务器 这样就不会断开了

ssh-copy-id 正解,然后配合上.ssh/config 配置。
详情:man ssh_config

感谢,SecureCRT 找到这个设置了。

感谢各位大佬,通过 key 确实是一种比较方便的方式。

ssh_config + ControlPath 也可以的

~/.ssh/config 别名 + bash 的 alias,不要太方便…

我 config 里定义有使用特定账户,特定端口 的 树莓派,命名为 pi

~/.bash_profile 里再

alias pi='ssh pi’

如此,开终端直接敲 pi 就登入这台树莓派。


mac 上用 SecureCRT 也是挺稀罕…

iTerm 也支持本地“花式分屏”:CMD + D (左右分) , CMD + Shift + D (上下分)

那就真比较奇怪了,服务器被黑,key 被改掉 /删除了?后来怎样了?找过 aws 客服?

新开一台服务器,同步代码系统,切换域名哈哈😄客服太慢了。不知是不是更新的事,只在 aws 出现过这样情况,原因也不好排查,毕竟连不上

vssh 没有什么是人民币做不了的事情

我都是在 zsh 配置好了的

回到顶部