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
Python中如何编写一个简单的Mac SSH连接工具并分享
确定是你姿势不对 其实在 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,使链接持久化,这样再次登录时也不用输入密码了
我回头试试
用 ssh config 和 key 就搞定的事情,随手找了个链接 http://codelife.me/blog/2012/09/01/ssh-session-profile-management-in-terminal-of-macos-x/
不是 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
sshpass
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 出现过这样情况,原因也不好排查,毕竟连不上
ssh -i
vssh 没有什么是人民币做不了的事情
我都是在 zsh 配置好了的

