emacs的tramp连接远程挂掉的问题解决

大约从去年的年初开始,我通过emacs就没办法正常的通道ssh访问远程系统中的内容了。这 个问题一直困扰着我,以致于我都想完全切换到vim了,这也是我现在使用的配置中使用了 evil-mode的由来。

其实这个问题在我这边表现的比较怪异,比如,我通过pscp访问openwrt的路由器,则没有 问题,访问远程的某个服务器(ubuntu系统),也没有问题,访问raspberry pi,有问题, 访问远程windows中的cygwin(我开通了cygwin的ssh服务),有问题。总之,看上去既和 操作系统有些关系,又和一部分软件有关,我甚至使用了默认的安装也是相同的结果。

从去年年初到现在,问题就这么一直困扰着我,虽然我尽量避免这种情况,但心头始终牵挂 着。直到上周,我重新在考虑shell的问题的时候,发现了端倪。

很早之前从网上便获知,shell可能会引起一部分问题,但我所有的测试环境都使用的是相 同的shell: bash,关于相关shell的设置,我也做了制定,但都没有解决我的问题。上周我 在连接局域网中的电脑和阿里云的远程主机的时候,发现这两个都可以访问,局域网中的电 脑用的是ubuntu 12.04,而阿里云用的是14.04(没记错的话),而家里的e9卡片式电脑, 却不可以,e9卡片式电脑用的是ubuntu 12.04,三个用的都是bash,甚至版本都有相同的。 但我注意到,e9卡片式电脑中的shell的PS1部分出现的是带颜色的,而其他的两个都不是带 颜色的,而从emacs的*Messages*中来看,出现下面的日志:

Unable to load color “PaleYellow” [2 times] Tramp: Opening connection for rix@172.10.1.199 using pscp… Tramp: Sending command `plink -l rix -ssh 172.10.1.199 && exit || exit’

Tramp: Waiting for prompts from remote shell Tramp: Sending password Tramp: Sending command `plink -l rix -ssh 172.10.1.199 && exit || exit’ Tramp: Opening connection for rix@172.10.1.199 using pscp…done Unable to load color “PaleYellow”

我注意到了有一个颜色相关的,我不知道这个到底是什么,无论是远程还是本地,我都没办 法找到这个叫”PaleYellow”的颜色相关内容。不过, 我找到了远程主机中与shell的PS1相 关的内容:

# uncomment for a colored prompt, if the terminal has the capability; turned
# off by default to not distract the user: the focus in a terminal window
# should be on the output of commands, not on the prompt
force_color_prompt=yes

if [ -n "$force_color_prompt" ]; then
    if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
  # We have color support; assume it's compliant with Ecma-48
  # (ISO/IEC-6429). (Lack of such support is extremely rare, and such
  # a case would tend to support setf rather than setaf.)
  color_prompt=yes
    else
  color_prompt=
    fi
fi

如果注释掉force_color_prompt=yes这一行,PS1将不会出现颜色,而这样一来,emacs访问 远程也正常了。

原来问题在这儿。。。。。

ssh服务器做中转的一个设置

一直觉得这个不重要,一直到自己不断的在这个地方绊倒,索性记录下来。

之前处于某种原因,需要将在内网的公司电脑通过ssh连接到路由上,并提供外网的远程连接服务,结果总是不行,刚开始以为是防火墙造成的,没想到将防火墙关闭了都没用,直到看到了ssh的网关选项没有打开。

sshd_config文件有一个选项:

       GatewayPorts yes
       

这个选项打开的时候便可以提供外网访问服务了,我记得之前有段时间傻乎乎的开了好几个进程来反转端口

手机通过Gravity上twitter

在国内实在是太闷了,闷的最近几年上访的人数也来越少了,他们都被安元鼎安元了。虽然目前还可以通过博客来透透气,在手机上看看河蟹写的文章,但看多了都不知道自己到底是在梦中还是在梦中了。

前几天毅然决定让我的破S60v3手机去被twitter从这片死海中捞起,于是开始了一番折腾。从网上下载下最新的Gravity,结果发现不支持自定义twitter的API。然后下载老的版本,使用twip架起梯子,结果发现网站不支持。申请免费网站,还是不支持。通过大神google的GAE,PC支持了,手机根本就不让访问.appspot.com。后来觉得家里的wii(通过DMZ,可以被公网访问)作为linux服务器实在太浪费了,天天耗电不干活,应该给它加点口粮了。于是就制定了一个方案:

将wii变成代理服务器。手机这边设置代理服务器为wii的地址,然后wii再将请求翻墙发给目的地。

linux这边翻墙还是有很多办法的,我是通过SSH的,于是调用fuck_gfw(我将ssh的翻墙放到了一个叫fuck_gfw的执行脚本中),端口绑定在7070,在别的电脑上设置socket代理,结果发现不可以。不过没关系,这不是最终目的,关键是fuck_gfw是可以fuck掉gfw的。然后就是让程序将http的请求变为socket转发到7070端口上。我想起了tor时代的polipo。(squid不知道是否可以,没做考察)

在wii上apt-get install polipo。默认安装完之后就自动启动了。调用:

       service polipo stop
       

停掉。默认的polipo绑定在8123端口,8123就8123吧,我没太大关系。关键是配置其他的:

proxyAddress = “0.0.0.0”

#allowedClients = 0.0.0.0 #这句话可能必须得注释掉,因为要通过公网访问

socketsParentProxy = “localhost:7070” #设置上层代理,必须

socketsProxyType = socks5 #通过socket

当然,你也可以通过其他的上层代理的方式,配置文档的注释写的比较详细的,我这里是socket的。

然后使用service polipo start 启动polipo。

接下来就是手机端了。安装gravity,不用说,这个做的太漂亮了。在连接设置里面,设置代理服务器为公网IP:8123,比如我的设置为:220.x.x.x:8123,不用带http://的,然后你就可以twitter了,其他的浏览器也可以一样的设置。你可以在任何地方通过使用这一代理太fuck gfw了。

在此途中,感谢 @vvoody的帮助和鼓励。其实手机上可以通过红杏什么的来翻墙,不过在我的案例中不支持而已。这种方式应该说比较普遍的,网上有很多路由器翻墙的教程,我也想直接修改路由器,这样功耗更小,但综合考虑,还是不冒这个险(刷路由器)比较好。

ssh翻墙

写在这里,防止忘记

ssh -qTfnN -D 7070 XXXX@XXX.XX

firefox的about:config设置:network.proxy.socks_remote_dns = True

PS:我觉得不设置也可以,反正就顺着设置了。

PS2:这段时间事情太多了,还搬了次家。新租的地方不是这里就是那里,总是有问题。网游的教程,下一个应该是客户端,代码早就整理好了,一直未提交版本,整理成文章。下午检出版本,运行了一下,发现上次提交的文件少了2个,应该是忘了加到仓库中了。明天一定把这个完成,最高优先级。