不止于linux SSH 基本用法-正反向代理-内外网穿透

2023-05-16

最近小伙伴们纷纷进了实验室,就冒出了一系列关于控制远程机器的问题,我觉得我还是有必要科普一下的。

约定

  1. 本文不讲解 Linux 使用方法,只讲解机器之间的通信方法。
  2. 下文中行首的 local$ 以及 remote$ 等为命令行的提示符,不是输入的内容,用于区分当前是在哪台机子上。

基础

在 Linux 系统上 SSH 是非常常用的工具,通过 SSH Client 我们可以连接到运行了 SSH Server 的远程机器上。SSH Client 的基本使用方法是:

ssh user@remote -p port
  • user 是你在远程机器上的用户名,如果不指定的话默认为当前用户
  • remote 是远程机器的地址,可以是 IP,域名,或者是后面会提到的别名
  • port 是 SSH Server 监听的端口,如果不指定的话就为默认值 22

实际上,知道了上面这三个参数,用任意的 SSH Client 都能连接上 SSH Server,例如在 Windows 上 PuTTY 就是很常用的 SSH Client。

local$ ssh user@remote -p port                                                      
user@remote's password:

在执行了 ssh 命令之后,远程机器会询问你的密码。在输入密码的时候,屏幕上不会显示明文密码,也不会显示 ******,这样别人就不会看到你的密码长度了,按下回车即可登入。

登入之后,你就可以操作远程机器啦!

安装 OpenSSH Server

local$ ssh user@remote -p port 
ssh: connect to host remote port 22: Connection refused

如果你遇到了上面的消息,说明在远程机器上没有安装 SSH Server,特别地,如果远程机器运行的是 Ubuntu Desktop 系统,那么默认是没有安装 SSH Server 的。这个时候,你可以联系管理员让他安装 SSH Server,或者如果你有 sudo 权限的话,可以执行下面命令安装:

sudo apt-get install openssh-server

免密码登入

每次 ssh 都要输入密码是不是很烦呢?与密码验证相对的,是公钥验证。也就是说,要实现免密码登入,首先要设置 SSH 钥匙。

执行 ssh-keygen 即可生成 SSH 钥匙,一路回车即可。Windows 用户可以使用 PuTTY 配套的 PuTTYgen 工具。

local$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa):
Created directory '/home/user/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user/.ssh/id_rsa.
Your public key has been saved in /home/user/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:47VkvSjlFhKRgz/6RYdXM2EULtk9TQ65PDWJjYC5Jys user@local
The key's randomart image is:
+---[RSA 2048]----+
|       ...o...X+o|
|      . o+   B=Oo|
|       .....ooo*=|
|        o+ooo.+ .|
|       .SoXo.  . |
|      .E X.+ .   |
|       .+.= .    |
|        .o       |
|                 |
+----[SHA256]-----+

这段话告诉了我们,生成的公钥放在了 ~/.ssh/id_rsa.pub,私钥放在了 ~/.ssh/id_rsa。接下来,我们要让远程机器记住我们的公钥。最简单的方法是 ssh-copy-id user@remote -p port

local$ ssh-copy-id user@remote -p port
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/user/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
user@remote's password:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'user@remote' -p port"
and check to make sure that only the key(s) you wanted were added.

ssh-copy-id 在绝大多数发行版上都有预装,在 Mac 上也可以通过 brew install ssh-copy-id 一键安装。

在没有 ssh-copy-id 的情况下(比如在 Windows 上),也是可以轻松做到这件事的。用命令的话也是一句话搞定

ssh user@remote -p port 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub

这句话的意思是,在远端执行新建 .ssh 文件夹,并把本地的 ~/.ssh/id_rsa.pub (也就是公钥)追加到远端的 .ssh/authorized_keys 中。当然,不使用这条命令的话,你也可以手动操作这个过程,即先复制公钥,再登入远程机器,粘贴到 .ssh/authorized_keys 当中。

在完成这一步之后,ssh 进入远程机器时就不用输入密码了。Windows 用户在 PuTTY 上面设置登入用户名和 PuTTYgen 生成的私钥之后也可以免密码登入。

配置别名

每次都输入 ssh user@remote -p port,时间久了也会觉得很麻烦,特别是当 userremote 和 port 都得输入,而且还不好记忆的时候。配置别名可以让我们进一步偷懒。

比如我想用 ssh lab 来替代上面这么一长串,那么在 ~/.ssh/config 里面追加以下内容:

Host lab
    HostName remote
    User user
    Port port

保存之后,即可用 ssh lab 登入,如果还配置了公钥登入,那就连密码都不用输入了。

Windows 用户使用 PuTTY 直接保存配置即可。

传输文件

在两台机之间传输文件可以用 scp,它的地址格式与 ssh 基本相同,都是可以省略用户名和端口,稍微的差别在与指定端口时用的是大写的 -P 而不是小写的。不过,如果你已经配置了别名,那么这都不重要,因为 scp 也支持直接用别名。scp 用起来很简单,看看下面的例子就明白了:

# 把本地的 /path/to/local/file 文件传输到远程的 /path/to/remote/file
scp -P port /path/to/local/file user@remote:/path/to/remote/file

# 也可以使用别名
scp /path/to/local/file lab:/path/to/remote/file

# 把远程的 /path/to/remote/file 下载到本地的 /path/to/local/file
scp lab:/path/to/remote/file /path/to/local/file

# 远程的默认路径是家目录
# 下面命令把当前目录下的 file 传到远程的 ~/dir/file
scp file lab:dir/file

# 加上 -r 命令可以传送文件夹
# 下面命令可以把当前目录下的 dir 文件夹传到远程的家目录下
scp -r dir lab:

# 别忘了 . 可以用来指代当前目录
# 下面命令可以把远程的 ~/dir 目录下载到当前目录里面
scp -r lab:dir/ .

Windows 用户可以使用 PuTTY 配套的 PSCP

如果觉得使用命令行传输文件浑身不自在,你还可以使用 SFTP 协议。任何支持 SFTP 协议的客户端都能用你的 SSH 账号信息登入并管理文件,比如开源的有图形化界面的FTP客户端 FileZilla。别忘了,在这些客户端里面,你也可以指定你的私钥(~/.ssh/id_rsa),然后就能做到无密码登入了。

保持程序在后台运行

有时候你想要在远程的机器上跑一个需要长时间运行的程序,比如一些计算,然后当你睡了一觉再登入远程的机子上却发现什么结果都没有。这是因为一旦 ssh 进程退出,所有它之前启动的程序都会被杀死。那么有什么办法可以保持程序在后台运行呢?

你需要在远程的机子上使用 tmuxtmux 是一个会话管理程序,他会保持程序一直运行着。在 Ubuntu 上你可以通过 sudo apt-get install tmux 来安装。

remote$ tmux

这样你就进入到了 tmux 管理的会话中,之后你再运行任何东西都不会因为你退出 ssh 而被杀死。要暂时离开这个会话,可以先按下 ctrl+b 再按下 d。要恢复之前的会话,只需要执行

remote$ tmux attach

tmux 还能管理多个窗口、水平竖直切分、复制粘贴等等,你可以看看这篇不错的文章来入门。

如果你是Mac用户,那么十分幸运的是,你几乎不需要任何学习,只要把你的终端由系统自带的 Terminal 换成 iTerm 2。iTerm 2 自带超好的 tmux 支持,你可以像操作本机的标签页一样操作 tmux 会话。你只需要在新建会话的时候使用 tmux -CC,在恢复的时候使用 tmux -CC attach 即可。具体的可以参见 iTerm2 and tmux Integration。

最后强调一遍,tmux 应该运行在远程的机子上,而不是本机上,否则程序在 ssh 退出时依然会被杀死。

反向端口转发:例子1

相信很多人都会有这样的需求:我实验室的机器和宿舍的机器都处在局域网中,但我需要在宿舍访问实验室的机器,或者反过来。这个时候,你需要一台处在公网的机器,如果没有的话,可以考虑腾讯云或者阿里云的学生优惠。

假设现在你有一台处在公网的机器 jumpbox,这台机器是在任何地方都能访问到的;你在实验室也有一台机子 lab,这台机子只能在实验室内部访问,但他可以访问公网,你希望能在任何地方都能访问这台机器。使用 ssh -R 可以轻松地做到这个事情。

lab$ ssh -R 10022:localhost:22 jumpbox
jumpbox$ ssh user@localhost -p 10022
lab$ 

如果上面这个过程成功了,就说明在你执行 ssh -R 10022:localhost:22 jumpbox 之后,你成功地将 lab 上的 22 端口反向转发到了 jumpbox 的 10022 端口。只要保持这个 ssh 不断,任何一台机器都可以首先连接到 jumpbox,然后通过 ssh user@localhost -p 10022 连回到 lab。可以看到,这里 jumpbox 起到了一个跳板的作用,所以我们把它称作跳板机

不过上面这么做并不稳健,如果因为网络波动导致 ssh -R 那个连接断了,那么从 jumpbox 就完全失去了到 lab 的控制。万幸的是,有一个叫做 autossh 的软件,可以自动的检测断线,并在断线的时候重连。在 Ubuntu 上你可以使用 sudo apt-get install autossh 来安装,在 Mac 上则是 brew install autossh

lab$ autossh -NfR 10022:localhost:22 jumpbox

上面这句话里面 -N 表示非不执行命令,只做端口转发;-f 表示在后台运行,也就是说,这句话执行之后 autossh 就在后台默默工作啦;-R 10022:localhost:22 就是把本地的22端口转发到远程的10022端口。

现在,任何一台电脑先连上跳板机,就可以连回内网的机子啦!

你甚至可以将这句话设置为开机时运行:在 /etc/rc.local 里面 exit 0 这句话之前加上

su - user -c autossh -NfR 10022:localhost:22 jumpbox

其中 user 是你的用户名。需要注意的是,如果你需要开机时运行 autossh,你需要配置公钥登入,因为开机运行的时候是没有交互界面让你来输入密码的。

这里顺带说一句,你可以绑定1024到65535之间的任意端口,只要这个端口之前没有程序在用就行。

反向端口转发:例子2

还是反向端口转发,再举一个很常见的例子:我在本地跑了一个网站,我想临时把我的网站发给朋友看看。你可以很容易的复现这个实验:在本地运行 python -m SimpleHTTPServer 即可在本地的8000端口启动一个网站,你可以在浏览器中通过 http://localhost:8000/ 看到。下面我们想让远方的朋友看到这个网站。

local$ ssh -NR 0.0.0.0:18000:localhost:8000 jumpbox

远方的朋友即可通过 http://jumpbox:18000/ 看到了。注意到这里和上面的命令有一个小小的不同,就是多了 0.0.0.0,这告诉 ssh,要把18000端口绑定在远端的所有IP上。如果像之前那样省略的话,缺省值是只绑定在 localhost,也就是只有在 jumpbox 本机才可以访问,而其他人都不能访问。

反向端口转发:例子3

比方说在本地的127.0.0.1:1080运行了HTTP代理服务,现在我想让另一台机子 remote 也能够使用这个HTTP代理。

local$ ssh -NR 11080:localhost:1080 remote
local$ ssh remote
remote$ export http_proxy=http://127.0.0.1:11080/
remote$ export https_proxy=http://127.0.0.1:11080/
remote$ curl http://ifconfig.co

看看返回的IP,是不是 remote 也用上了代理?

正向端口转发

反向端口转发是把本机的端口转发到远程的机子上;与之对应,正向端口转发则是把远程的端口转发到本地。

比方说,之前我们把 lab 的22端口反向转发到了 jumpbox 的10022端口,现在我想把它转发到本机的20022端口,只需要执行 ssh -L 就行了,例如:

local$ ssh -NL 20022:localhost:10022 jumpbox
local$ ssh localhost -p 20022
lab$ 

用作 SOCKS5 代理

要是想要在家访问公司内网的一些网站,但是公司又没有提供进入内网的VPN,那怎么办呢?通过 ssh -D 可以在本地建立起一个 SOCKS5 代理:

local$ ssh -ND 1080 workplace

如果 workplace 处在内网,不要忘记前面讲到可以用反向端口转发和跳板机来解决这个问题。现在,你可以在浏览器的设置里面,把代理服务器设成 socks5://127.0.0.1:1080,然后你就可以看到 workplace 能看到的所有网站啦。

传递图形界面

上面我们都是在运行命令行程序,那如果远程有一些程序是不得不用图形界面的话,是不是无解了呢?实际上,恰恰相反,X11的设计天生就支持这样的行为。

首先,我们需要在本机装上 X Server:Linux 桌面用户本身就已经有了 X Server,Windows 用户可以使用 Xming,Mac 用户需要使用 XQuartz。

安装好了 X Server 之后,我们通过 ssh -X 进行连接,例如:

local$ ssh -X remote
remote$ xeyes

现在你应该会看到一对傻傻的眼睛,这就说明成功了,注意,这个眼睛是跑在远程的,而输入和输出都是在本地。这个方法几乎可以运行任何图形界面的程序,比如你可以试试看运行 nautilus 或者 firefox

39013793019f26e2c7e37f37c53a8794.png

ssh 命令除了登陆外还有三种代理功能:

  • 正向代理(-L):相当于 iptable 的 port forwarding
  • 反向代理(-R):相当于 frp 或者 ngrok
  • socks5 代理(-D):相当于 ss/ssr

如要长期高效的服务,应使用对应的专用软件。如没法安装软件,比如当你处在限制环境下想要访问下某个不可达到的目标,或者某个临时需求,那么 ssh 就是你的兜底方案。

 

正向代理:

所谓“正向代理”就是在本地启动端口,把本地端口数据转发到远端。

用法1:远程端口映射到其他机器

HostB 上启动一个 PortB 端口,映射到 HostC:PortC 上,在 HostB 上运行:

HostB$ ssh -L 0.0.0.0:PortB:HostC:PortC user@HostC

这时访问 HostB:PortB 相当于访问 HostC:PortC(和 iptable 的 port-forwarding 类似)。

用法2:本地端口通过跳板映射到其他机器

HostA 上启动一个 PortA 端口,通过 HostB 转发到 HostC:PortC上,在 HostA 上运行:

HostA$ ssh -L 0.0.0.0:PortA:HostC:PortC  user@HostB

这时访问 HostA:PortA 相当于访问 HostC:PortC。

两种用法的区别是,第一种用法本地到跳板机 HostB 的数据是明文的,而第二种用法一般本地就是 HostA,访问本地的 PortA,数据被 ssh 加密传输给 HostB 又转发给 HostC:PortC。

反向代理:

所谓“反向代理”就是让远端启动端口,把远端端口数据转发到本地。

HostA 将自己可以访问的 HostB:PortB 暴露给外网服务器 HostC:PortC,在 HostA 上运行:

HostA$ ssh -R HostC:PortC:HostB:PortB  user@HostC

那么链接 HostC:PortC 就相当于链接 HostB:PortB。使用时需修改 HostC 的 /etc/ssh/sshd_config,添加:

GatewayPorts yes

相当于内网穿透,比如 HostA 和 HostB 是同一个内网下的两台可以互相访问的机器,HostC是外网跳板机,HostC不能访问 HostA,但是 HostA 可以访问 HostC。

那么通过在内网 HostA 上运行 ssh -R 告诉 HostC,创建 PortC 端口监听,把该端口所有数据转发给我(HostA),我会再转发给同一个内网下的 HostB:PortB。

同内网下的 HostA/HostB 也可以是同一台机器,换句话说就是内网 HostA 把自己可以访问的端口暴露给了外网 HostC。

按照前文《韦易笑:内网穿透:在公网访问你家的 NAS》中,相当于再 HostA 上启动了 frpc,而再 HostC 上启动了 frps。

 

本地 socks5 代理

在 HostA 的本地 1080 端口启动一个 socks5 服务,通过本地 socks5 代理的数据会通过 ssh 链接先发送给 HostB,再从 HostB 转发送给远程主机:

HostA$ ssh -D localhost:1080  HostB

那么在 HostA 上面,浏览器配置 socks5 代理为 127.0.0.1:1080,看网页时就能把数据通过 HostB 代理出去,类似 ss/ssr 版本,只不过用 ssh 来实现。

 

使用优化

为了更好用一点,ssh 后面还可以加上:-CqTnN 参数,比如:

$ ssh -CqTnN -L 0.0.0.0:PortA:HostC:PortC  user@HostB

其中 -C 为压缩数据,-q 安静模式,-T 禁止远程分配终端,-n 关闭标准输入,-N 不执行远程命令。此外视需要还可以增加 -f 参数,把 ssh 放到后台运行。

这些 ssh 代理没有短线重连功能,链接断了命令就退出了,所以需要些脚本监控重启,或者使用 autossh 之类的工具保持链接。

功能对比

正向代理(-L)的第一种用法可以用 iptable 的 port-forwarding 模拟,iptable 性能更好,但是需要 root 权限,ssh -L 性能不好,但是正向代理花样更多些。反向代理(-R)一般就作为没有安装 frp/ngrok/shootback 时候的一种代替,但是数据传输的性能和稳定性当然 frp 这些专用软件更好。

socks5 代理(-D)其实是可以代替 ss/ssr 的,区别和上面类似。所以要长久使用,推荐安装对应软件,临时用一下 ssh 挺顺手。

 

--

补充下 iptable 的 port-forwarding 怎么设置,十分管用的功能,两个函数即可:

#! /bin/sh

# create forward rule by source interface
# http://serverfault.com/questions/532569/how-to-do-port-forwarding-redirecting-on-debian
PortForward1() {
    local IN_IF=$1
    local IN_PORT=$2
    local OUT_IP=$3
    local OUT_PORT=$4
    local IPTBL="/sbin/iptables"
    echo "1" > /proc/sys/net/ipv4/ip_forward
    $IPTBL -A PREROUTING -t nat -i $IN_IF -p tcp --dport $IN_PORT -j DNAT --to-destination ${OUT_IP}:${OUT_PORT}
    $IPTBL -A FORWARD -p tcp -d $OUT_IP --dport $OUT_PORT -j ACCEPT
    $IPTBL -A POSTROUTING -t nat -j MASQUERADE
}

# create forward rule by source ip
# http://blog.csdn.net/zzhongcy/article/details/42738285
ForwardPort2() {
    local IN_IP=$1
    local IN_PORT=$2
    local OUT_IP=$3
    local OUT_PORT=$4
    local IPTBL="/sbin/iptables"
    echo "1" > /proc/sys/net/ipv4/ip_forward
    $IPTBL -t nat -A PREROUTING --dst $IN_IP -p tcp --dport $IN_PORT -j DNAT --to-destination ${OUT_IP}:${OUT_PORT}
    $IPTBL -t nat -A POSTROUTING --dst $OUT_IP -p tcp --dport $OUT_PORT -j SNAT --to-source $IN_IP
}

第一个函数是按照网卡名称设置转发:

PortForward1 eth1 8765 202.115.8.2 8765

这时,本地 eth1 网卡的 8765 端口就会被转发给 202.115.8.2 的 8765 端口。

第二个函数是按照本机的 ip 地址,比如本机是 192.168.1.2:

PortForward2 192.168.1.2 8765 202.115.8.2 8765

那么任何访问本机 192.168.1.2 这个地址 8765 端口,都会被转发到 202.115.8.2:8765

这个 iptable 的 port forwarding 是内核层运行的,性能极好,只不过每次重启都需要重新设置下。

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

不止于linux SSH 基本用法-正反向代理-内外网穿透 的相关文章

  • 从两个角度理解Kubernetes基本概念

    想要理解Kubernetes集群首先要思考两个问题 xff1a 它是由什么组成的 它是怎样工作的 而想要搞清楚这两个问题我们可以在两个不同的层面寻找答案 从物理层面看 从直观的层面来看 xff0c Kubernetes将多个物理机或虚拟机汇
  • 基于CentOS 7.6搭建Kubernetes 1.17.3集群demo

    本demo仅涉及基本的Kubernetes功能实践与介绍 xff0c 无高可用配置 部署版本为当前时间阿里开源镜像站提供的最新版本1 17 3 文章目录 部署环境安装准备域名解析关闭SELinux和防火墙配置yum源时间同步禁用swap加载
  • 为Kubernetes部署dashboard组件

    dashboard是Kubernetes社区中一个很受欢迎的开源项目 xff0c 它可以为使用者提供一个可视化web界面来进行Kubernetes的管理和使用 环境信息 组件版本Kubernetesv1 17 3dashboardv2 0
  • linux UIO驱动实践

    linux UIO驱动实践 环境搭建platform 设备驱动UIO驱动 环境搭建 Ubuntu20地址 虚拟机安装与配置见博客开头 xff1a 驱动虚拟环境搭建记录 一直以为用镜像直接安装的Ubuntu没有内核源码 xff0c 不能用来编
  • STM32F429+FreeRTOS队列 串口DMA双缓存数据接收

    前言 最近做项目需要用到数据大量数据处理的应用场景 xff0c 本来想使用串口空闲中断 43 DMA传输 43 FreeRTOS队列的方式接收数据 xff0c 然而实际使用中发现效果不理想 xff0c 经常丢包 最后查明原因为在空闲中断频繁
  • 世界上最经典的25句话

    1 记住该记住的 xff0c 忘记该忘记的 改变能改变的 xff0c 接受不能改变的 2 能冲刷一切的除了眼泪 xff0c 就是时间 xff0c 以时间来推移感情 xff0c 时间越长 xff0c 冲突越淡 xff0c 仿佛不断稀释的茶 3
  • Makefile详解——从入门到精通

    转自ChinaUnix xff0c 作者gunguymadman xff0c 陈皓 链接地址 xff1a http www chinaunix net jh 23 408225 html 陈皓 CSDN 博客 xff1a http blog
  • FreeRTOS事件标志组与事件标志位使用

    事件标志位 事件位用于指示事件是否发生 也叫做事件标志位 可用位表示 xff1a 当信息收到且准备好处理时 xff0c 设置为1 xff1b 当没有收到信息且等待处理时 xff0c 设置为0 事件标志组 事件标志组是一组事件位 xff0c
  • 结合图片看常用串口通信UART

    结合图片看常用串口通信UART UART是一种通用串行数据总线 xff0c 用于异步通信 该总线双向通信 xff0c 可以实现全双工传输和接收 在嵌入式设计中 xff0c UART用于主机与辅助设备通信 xff0c 如汽车音响与外接AP之间
  • 浅谈面向对象设计思想,以及在Linux内核中的体现

    面向对象编程 xff08 OOP xff09 xff0c 是一种设计思想或者架构风格 OO语言之父Alan Kay xff0c Smalltalk的发明人 xff0c 在谈到OOP时是这样说的 xff1a OOP应该体现一种网状结构 xff
  • STM32F4移植FreeRTOS

    在之前的文章 xff1a FreeRTOS全解析 2 源码结构与移植 中我们已经讲解过FreeRTOS移植的方法 xff0c 并且给出了一个在ARM9上移植的例子 xff0c 今天再来看一个例子 xff1a 板子的芯片为STM32F407
  • 彻底掌握FreeRTOS中的任务

    FreeRTOS是个操作系统 xff0c FreeRTOS的任务 task 其实就是像我们电脑中的一个独立程序 xff0c 表现在源码中 xff0c 其实就是一个函数 本文从学会使用任务 task 到理解逐步深入 参考资料 xff1a Ma
  • FreeRTOS任务之调度器中的三种调度算法

    本文主要讲解FreeRTOS调度器中的三种调度算法 xff1a 基于时间片的抢占式调度 不带时间片的抢占式调度和协同调度 前导文章 xff1a FreeRTOS全解析 3 任务 xff08 task xff09 参考资料 xff1a Mas
  • 彻底理解FreeRTOS中的队列(Queue)

    队列 xff08 Queue xff09 提供了任务与任务之间通信的机制 在这样的场景 xff1a 一个或多个其他的任务产生数据 xff0c 主任务要依次处理数据 xff0c 队列就显得非常有用了 参考资料 xff1a Mastering
  • 简单路由器DIY

    一 关于路由器 路由器 xff08 Route xff09 是一种负责寻径的系统 xff0c 在互连网络中从多条路径中寻找通讯量最少的一条网络路径提供给用户通信 它使用寻径协议来获得网络信息 xff0c 采用基于 34 寻径矩阵 34 的寻
  • DOS那一代的程序员现在都干嘛呢?

    亿友论坛 DOS那一代的程序员现在都干嘛呢 xff1f xff08 几年前的老帖子 xff09 作者 xff1a 包子夹蛋 发布时间 xff1a 2005 5 10 14 01 00 DOS那一代的程序员现在都干嘛呢 xff1f xff08
  • switch case的用法

    switch case的用法如下 1 Switch用在编程中 xff0c 如C语言中它经常跟Case一起使用 xff0c 是一个判断选择代码 其功能就是控制流程流转的 直线翻译 xff1a switch语句 xff0c 即 切换 语句 xf
  • Rust嵌入式:只使用寄存器为STM32点灯;从查手册开始

    为什么是 只使用寄存器 网上很多教程都是直接调用对应芯片的HAL库 xff0c 让初学者认为操作都被Rust嵌入式开源组封装好了 xff0c 直接调就好 这在目前Rust嵌入式生态还不成熟的情况下可能是个误解 实际上Rust嵌入式有自己独特
  • epoll_wait 中timeout参数的损耗和如何避免

    ccd 100qps xff0c dcc 4wqps
  • ubuntu和windows双系统默认启动顺序

    在安装了双系统后 xff0c 一般的默认启动ubuntu xff0c 但我实际可能使用windows会比较多 xff0c 为解决这个问题 xff0c 必须要更改默认顺序 xff0c 以达到方便我们使用的效果 方法 xff1a 开机界面会有显

随机推荐

  • 深度学习优化算法

    深度学习各类优化器 借用古代炼丹的一些名词 xff0c 我们可以把训练模型中的数据比做炼丹药材 xff0c 模型比做炼丹炉 xff0c 火候比做优化器 那么我们知道 xff0c 同样的药材同样的炼丹炉 xff0c 但是火候不一样的话 xff
  • yolov3

    YOLOv3 YOLOv3的总体网络架构图 可根据官方代码中的yolov3 cfg进行一一对应 xff0c 标号 0 0 0 是第一个 convolutional Darknet 53 和DarkNet 19一样 xff0c 同样下采样32
  • SSH远程连接报错:kex_exchange_identification: Connection closed by remote host

    突然出现问题 xff1a kex exchange identification Connection closed by remote host 解决方法 删除known hosts xff0c 重启终端即可
  • Dronekit——Introduction

    Dronekit Introduction 参考 xff1a http python dronekit io about overview html 关于Dronekit DroneKit Python允许开发人员创建 在板载协同计算机上运
  • Run dronekit scripts by SITL on Linux 执行dronekit 脚本在Linux系统下模拟飞行

    参考 xff1a http ardupilot org dev docs setting up sitl on linux html Overview The SITL simulator allows you to run Plane C
  • SLAM从入门到放肆——SLAM简述

    SLAM 同时定位与建图 xff08 simultaneous localization and mapping xff0c SLAM xff09 是自动驾驶与增强现实领域中常用的技术 主要研究装置通过各种传感器在未知环境中的感知与定位问题
  • 关于NoDriveTypeAutoRun的键值

    最近在写一个修改注册表的驱动 xff0c 只是为了好玩 xff0c 也算是一个恶搞驱动吧 xff01 遇到一个问题 xff0c 花了我差不多两天的时间的 xff0c 详情往下看 写这篇文章 xff0c 为了记住这个教训 xff0c 一个提供
  • 闭包的实现原理和作用、以及内存泄露

    一 闭包的实现原理和作用 xff0c 可以列举几个开发中闭包的实际应用 1 闭包的概念 xff1a 指有权访问另一个函数作用域中的变量的函数 xff0c 一般情况就是在一个函数中包含另一个函数 2 闭包的作用 xff1a 访问函数内部变量
  • PX4 SITL Gazebo 仿真时 libgazebo_multirotor_base_plugin 插件运行时出错

    PX4 SITL Gazebo 仿真时 libgazebo multirotor base plugin 插件运行时出错 问题描述原因分析解决办法总结 问题描述 在 Gazebo 中进行 PX4 的软件在环仿真时 xff0c 执 make
  • Jetson AGX Xavier 正确上手教程

    概览 1 开机1 1 配件1 2 需要准备的器材1 3 连接设备 2 刷机2 1 更换主机的 apt get 源2 2 在主机上安装 SDK ManagerStep 1Step xff12 Step xff13 烧录 OS 镜像安装 SDK
  • Matplotlib绘图显示缺少中文字体-RuntimeWarning: Glyph 8722 missing from current font.

    pyplot 并不默认支持中文显示 xff0c 也没有自带中文字体 xff0c 因此需要自行下载所需字体 xff0c 并修改 rcParams 参数来显示中文 下面以 SimHei xff08 黑体 xff09 字体为例进行说明 说明 xf
  • Win10 系统安装 Linux 子系统教程(WSL2 + Ubuntu 20.04 + Gnome 桌面 )

    Win10 系统安装 Linux 子系统教程 WSL2 43 Ubuntu 20 04 43 Gnome 桌面 xff09 1 WSL 简介1 1 什么是 WSL xff1f 1 2 WSL1 与 WSL2 2 安装 WSL2 1 安装 W
  • Ubuntu 桌面美化教程

    将 Ubuntu 桌面美化成 Mac 风格 xff0c 效果如下 1 美化任务栏 Ubuntu 20 04 默认的任务栏在桌面左侧 xff0c 不使用时会自动隐藏 安装 plank dock 工具可以在桌面底部设置一个常驻任务栏 xff08
  • Git 图解教程

    Git 图解教程 基础篇 git 简介 安装与配置 安装 git 配置 git 创建版本库 跟踪修改 提交修改 比较文件 辅助命令 创建分支 合并分支 git merge git rebase 高级篇 移动提交记录 分离的 HEAD 相对引
  • Doxygen + Graphviz 代码自动化分析

    Doxygen 43 Graphviz 代码自动化分析 目录 1 实际需求2 工具简介3 使用说明4 代码注释规范5 参考 1 实际需求 在开发程序时 xff0c 需要编写对应的说明文档 在阅读现有的项目源代码时 xff0c 需要梳理函数间
  • Microsoft Learn: Docker入门教程

    Microsoft Learn Docker入门教程 1 Introduction2 What is Docker3 How Docker images work4 How Docker containers work5 When to u
  • 将kitti数据集中的velodyne points转换为ROS bag文件

    kitti数据集中包含了相机图像 激光扫描得到的点云信息 高精度GPS测量信息和IMU加速度信息 xff0c 用于移动机器人与自动驾驶方面的研究 如下为数据采集平台示意图 kitti数据集中的激光扫描数据是以二进制文件形式存储的 xff0c
  • 使用 Dockerfile 创建一个简单的容器

    Dockerfile Dockerfile 是用于指导 docker 创建自定义 image 的一系列指令 xff0c 是用于创建 image 的蓝图 现在有一个简单的 node 项目 其中Dockerfile 是后面加的 xff0c 初始
  • 导航英语专业词汇——不停更新

    惯性导航 inertia 惯性INS 惯性导航系统GINS 平台惯性导航系统SINS 捷联惯性导航系统IMU 惯性导航元件gyroscope 陀螺仪accelerometer 加速度计 SLAM 词汇词性意思 导航中用 SLAM词组同步定位
  • 不止于linux SSH 基本用法-正反向代理-内外网穿透

    最近小伙伴们纷纷进了实验室 xff0c 就冒出了一系列关于控制远程机器的问题 xff0c 我觉得我还是有必要科普一下的 约定 本文不讲解 Linux 使用方法 xff0c 只讲解机器之间的通信方法 下文中行首的 local 以及 remot