Python函数式编程之 update_in_fn

接上一篇内容 Python函数式编程之自定义函数get_in 。这次我们来编写函数式风格的修改字典/列表值的通用函数。 我们先来假设一种情况,你有一个嵌套的动态字典,想要更新里面某个键对应的值,我们用代码来说明 data = {'a': {'b': 1}} 现在有一个变量data 他的值是一个两层的字典,如果我要更新 b 的值到 2 常规的做法是这样的 data['a]['b'] = 2 如果我有一个更加深的字典 data = {'a': {'b': {'c': {'d': 1}}}} 更新值的写法 data['a']['b']['c']['d''] = 2 这里有一个情况发生了,当 data 是一个动态数组,你不确定中间的某个键是否存在的时候就会有报错 假如这个数据是你的系统里面其他团队开发的一个微服务,报错的信息是int 对象是不可读取索引的,这会让人很奇怪,2这个int对象明明是一个值,而不是用来查找索引数据的。 这时候程序的健壮性是比较差的,要想让程序保证健壮,我们可以使用 if-else 来判断每个键是否存在,就像这样 这里的三个if 看起来一点都不够优雅,如果其他地方也有同样的写法,只是键的顺序和名字不一样而已呢。能不能封装一个通用的函数来处理类似的情况呢? update_in Python支持面向过程、面向对象、函数式等多范式编程。我们可以使用函数式编程思想来达到这一点。先来看一个简单一点的 update_in 函数 from typing import Dict, List, T def update_in(data: Dict, ks: List, value: T): """Updates a value in a nested associative structure. Args: data (Dict): nested associative structure ks (List): sequence of keys value (Any): new value """ if len(ks) == 0: return cursor = data for k in ks[:-1]: if k not in cursor: cursor[k] = {} elif not isinstance(cursor[k], dict): cursor[k] = {} cursor = cursor[k] cursor[ks[-1]] = value 这里有一个类型 T ,这是Python内置的任意类型,在 typing 模块可以看到定义 T = TypeVar('T') ...

May 19, 2023

使用MobaXterm做端口转发

SSH端口转发的作用 SSH端口转发是一种网络技术,它允许用户通过SSH连接到远程主机并在两个计算机之间安全地传输数据。SSH端口转发将本地端口绑定到远程主机上的一个端口,从而允许用户在本地主机上运行服务并让远程主机访问该服务。 SSH端口转发可以用于以下几种情况: 安全访问远程服务:在某些情况下,用户需要访问远程主机上的服务,但是这些服务可能不安全或未加密。使用SSH端口转发,用户可以通过SSH隧道连接到远程主机,并将本地端口绑定到远程主机上的服务端口,从而安全地访问远程服务。 绕过防火墙限制:某些网络环境下,防火墙可能会限制对某些端口的访问。使用SSH端口转发,用户可以将本地端口绑定到远程主机上的允许端口,并通过SSH隧道访问被限制的服务。 远程调试应用程序:使用SSH端口转发,开发人员可以在本地主机上运行调试器,并将本地端口绑定到远程主机上的应用程序端口,从而可以在本地主机上调试远程应用程序。 SSH端口转发是一种强大的网络技术,可以帮助用户安全地访问远程服务,绕过防火墙限制以及进行远程调试应用程序等操作。 SSH端口转发的应用场景 SSH端口转发可以用于以下场景: 访问本地服务:在某些情况下,用户需要访问本地主机上的服务,但是该主机无法公开访问。使用SSH端口转发,用户可以将本地服务端口绑定到远程主机上的端口,从而在远程主机上访问本地服务。 跳板机访问内网服务:在企业内部网络中,某些服务可能只能在内网中访问。使用SSH端口转发,用户可以通过跳板机访问内网服务,而无需直接暴露内网服务。 安全文件传输:使用SSH端口转发,用户可以在两台主机之间安全地传输文件,而无需将文件暴露在公共网络中。 SSH端口转发是一种非常有用的网络技术,可以帮助用户在各种场景下安全地访问服务和传输数据。 MobaXterm软件 MobaXterm是一款功能强大的终端软件,不仅支持SSH连接,还支持端口转发功能。在MobaXterm中进行端口转发非常简单,只需要在SSH会话中配置端口转发规则即可。用户可以通过MobaXterm实现安全访问远程服务、绕过防火墙限制、访问本地服务、跳板机访问内网服务以及安全文件传输等操作。 配置MobaXterm端口转发访问服务器内网的数据库案例 假设用户需要从本地主机访问远程服务器内网中的数据库,可以使用MobaXterm进行端口转发。首先,在MobaXterm中创建一个SSH会话到远程服务器,然后在“端口转发”选项卡中添加一个新的端口转发规则。用户需要将本地主机上任意一个端口绑定到远程服务器上的数据库端口(通常是3306),并选择“本地端口绑定到远程端口”选项。然后,用户可以在本地主机上使用数据库客户端连接到绑定的本地端口,从而访问远程服务器内网中的数据库。 首先找到工具栏上的 Tunneling 按钮,如图1 图1 在弹出的 MobaSSHTunnel 窗口的左下角点击 New SSH tunnel 按钮,如图2 图2 在弹出的配置窗口,填写本地监听的端口 Forwarded port , SSH server SSH login SSH port ,然后是目标服务器的IP地址和端口 Remote server Remote port 图3 SSH login 指得是登录跳板机的用户名 可以把登录的服务器当中跳板机,把本地的端口转发到内网的其他机器 当然,还有更简单的一行命令就可以搞定的方式 😁 ssh -L local_port:remote_server:remote_port ssh_login@ssh_host_or_ip 名称 解释 local_port 本地监听端口 remote_server 目标服务器内网IP remote_port 目标服务器端口 ssh_login 跳板机使用用户名 ssh_host_or_ip 跳板机的host或者ip Socks协议 偷偷的告诉你,还可以使用这种方式来进行socks协议的转发,这个办法可以用来科学上网哟 😀上 ...

February 24, 2023

保持SSH会话在线

保持SSH会话在线 1. 概览 有多少次,我们想要保持SSH会话一直处于连接状态,以保持应用程序运行,或者只是避免在返回我们使用的SSH窗口时感到沮丧。 在本教程中,你将获得如何通过防止SSH会话超时,直到你关闭终端窗口。 2. 为什么SSH会关闭连接? 我们为了使用SSH登录到服务器上,目的服务器上的守护进程(sshd)一定是保持运行状态。如果SSH客户端一段时间没有发送到目的服务器,服务器会在超过一段时间后关闭连接。 为了防止关闭SSH连接,我们可以在客户端或者服务端进行配置。 3. 设置配置文件 有几个配置文件可以修改,以保持SSH会话的连接,避免超时。要看是从客户端配置还是服务端配置。 3.1 客户端配置 客户端文件位置 $HOME/.ssh/config 如果我们使用使用 cat $HOME/.ssh/config ,可能会得到一个错误信息 “no file found”。 $ cat $HOME/.ssh/config cat: /.ssh/config: No such file or directory 如果我们看到这个错误消息,意味着我们需要手动创建这个配置文件。如果 .ssh 目录不存在,首先创建 .ssh 目录,使用命令 mkdir $HOME/.ssh 来创建目录,如果提示目录已经存在,我们将会看到一个消息 “File exists”,请忽略即可;如果目录创建成功,我们不会看到任何输出信息。 $ mkdir $HOME/.ssh 然后创建配置文件 touch $HOME/.ssh/config。 $ touch $HOME/.ssh/config 一旦我们创建好配置文件,我们还需要使用 chmod 修改配置文件的权限,不能让所有人都可以编辑这个配置文件。 $ chmod 600 $HOME/.ssh/config 现在我们可以任何编辑器来编辑这个配置文件了,比如 nano 或者 vim ,在终端使用 vim $HOME/.ssh/config 打开配置文件。 现在让我们来添加一些配置信息到配置文件里面。在 vim 按 i 进入编辑模式,然后输入下面的内容: ...

November 29, 2022

yum通过ssh代理安装

在机房的机器有时候请第三方服务公司安装完系统后没有检查网络,结果上不了网,最后连安装个gcc都不行。没有办法,只能通过代理安装,方法很简单。 需要有一台可以上网的linux机器,假设是A机器IP是192.168.1.100,另外一台不能上网的是B机器IP是192.168.2.200 用Xshell(或者其他ssh客户端)登录B机器,使用下面的命令登录到A机器: ssh -D 1080 root@192.168.1.100 输入A机器的密码,这时候ssh会开一个1080监听端口,所有发往这个端口的请求被转发到ssh所连接的机器,然后通过所连接的机器转发请求,这样就实现了ssh代理。ssh现在支持的协议是socks4和socks5。 然后在另外一个终端登录B机器,修改/etc/yum.conf文件,在文件最后添加下面一行: proxy=socks5h://localhost:1080 保存退出,这时候你再运行yum命令,完全不障碍。 其实都已经开了1080端口了,其他任何支持代理设置的程序都可以使用此socks5h://localhost:1080进行代理,比如: curl -x socks5h://localhost:1080 http://www.baidu.com 如果其他的方式,比如ftp之类的,也需要使用代码的话,可以把下面的内容保存到一个文件proxy.sh,然后使用source proxy.sh加载一下 #!/bin/sh # add follows to the end (set proxy settings to the environment variables) MY_PROXY_URL="socks5h://localhost:1080" HTTP_PROXY=$MY_PROXY_URL HTTPS_PROXY=$MY_PROXY_URL FTP_PROXY=$MY_PROXY_URL http_proxy=$MY_PROXY_URL https_proxy=$MY_PROXY_URL ftp_proxy=$MY_PROXY_URL export HTTP_PROXY HTTPS_PROXY FTP_PROXY http_proxy https_proxy ftp_proxy 例子 pip pip使用代理的时候有一点区别,需要把上面proxy.sh里面的协议socks5h修改成socks5才可以使用。 Enjoy ^_^.

July 7, 2018