分类
未分类

Windows Server 2016安装SSH Server

开头我先吐个槽,vultr最近在搞有奖征文活动,所以我就把本来是这篇文章要写的东西写成英文投了上去,然而他们不收。看来他们觉得在winserver上装Cygwin+SSH Server的技术含量还是太低了,而且根本没有必要。毕竟国外网络可好了不是么。再说了我看Windows Server系统板块压根就没有新文章投上去,换句话说谁写win相关的文章都有极大可能被拒的。

然而在国内这是非常有必要的事情,不然我也就不会写这篇文章了。每天晚上八点我的外网速度就只有十几KB/s,简直比拨号上网还要慢。要是用RDP的话我连拖动个窗口都别想,就算我的旧快照里面有Cygwin也没有什么卵用。所以必须搞个SSH Server然后用SSH的方式搞事情。这样的话除了某些Linux更适合的应用(比如LAMP stack)外,用起来和Linux系统基本上一点区别都没有,而且还支持大量win应用,比如度盘和UltraISO,岂不美哉。

我们先从哪儿开始呢?如果没有装Cygwin的话先装个Cygwin,别忘了在Select Packages里装上wget。以后我们配置好apt-cyg就直接可以用命令行的方式安装任何东西了,不用再折腾蛋疼的setup-x86_64.exe了。

打开Cygwin窗口,输入下面的东西:

wget https://github.com/transcode-open/apt-cyg/raw/master/apt-cyg
install apt-cyg /bin
apt-cyg install ssh-pageant openssh openssl

然后理论上就装完了SSH所需的所有组件。

接下来去高级防火墙设置里开启22端口,不然别想连接到接下来要搞的SSH Server。然后打开环境变量,在PATH变量的后面追加Cygwin可执行文件的路径(一般为C:\cygwin64\bin),再建一个叫做CYGWIN的环境变量,值可以瞎激霸搞,但接下来需要填这个值,所以需要记下来。

然后在Cygwin窗口里输ssh-host-config进行SSH Server的配置。我懒得复述了,直接粘贴我当时写的一堆英文:

* when asked about `Query: Should StrictModes be used? (yes/no)`, answer with “no”;
* when asked about `Query: new local account ‘sshd’? (yes/no)`, answer with “yes”;
* when asked about `Query: Do you want to install sshd as a service?`, answer with “yes”;
* when asked about `Query: Enter the value of CYGWIN for the daemon: []`, answer with the value you previously set for the environment variable “`CYGWIN`” (in this case, “`NEIN NEIN NEIN NEIN NEIN NEIN`”);
* when asked about `Query: Do you want to use a different name? (yes/no)`, answer with “no”;
* when asked about `Query: Create new privileged user account ‘VULTR-GUEST\cyg_server’ (Cygwin name: ‘cyg_server’)? (yes/no)`, answer with “yes”, and set up the password for user `cyg_server` of your own accord;

它里面有两个需要注意的点,一个是问到CYGWIN变量的值,另外一个是设置cyg_server用户的密码,由于Cygwin的SSH Server并没有SYSTEM用户的权限,所以它用cyg_server来作root用户。所以这个就相当于root密码了。当然Cygwin的权限管理肯定没有那么完全,但好像chmod和chown是可以用的。对应的NTFS权限我就不清楚了。

管它呢,上述脚本搞完后就搞完了,打开cmd然后net start sshd,然后随便找个客户端连下试试(用winserver的用户名和密码)。然后再重启一遍,看sshd作为系统服务能否正常工作。如果能的话,我们就可以扔掉RDP用SSH了。Bitvise的SSH Client有一个Remote Desktop功能也能用,SFTP也能用(反正比RDP自带的文件传送好用多了),SSH Tunnel好像也能用,反正现在爽的1b了。

这样的话,我搞我的拖站玩意的时候就可以在那几台winserver上装个screen,然后就像我搞Linux时一样,把脚本放screen里搞就是了,相当爽。反正这段时间我也相应优化了一下拖站流程,比如以前我需要把所有东西先全部下到我的洛杉矶中转服务器里然后再用新加坡节点从中转服务器下,但我发现这两个过程中文件都是一个一个下的,没有任何并行性,所以中转服务器一次只需要存储一个文件即可,新加坡节点则需要用ssh命令控制中转服务器先从某处(或者叫做源服务器)下到它自己的webroot,然后再从中转服务器下,然后再用ssh命令控制中转服务器删掉那个文件,然后把这个过程写成一个for循环。这样哪怕有5个线程,只要中转服务器有6GB的可用空间就能搞了(多留1GB,因为我发现空间严重不足时新加坡节点的wget速度会减慢,甚至会断连)。我以前拖站时搞的所有东西,比如获取下载链接然后转换成中间服务器的形式等,都可以自动化了,我只需从源服务器获取一份文件列表,将其分成几份,然后保存成新加坡节点的list,然后再执行我的shell脚本就搞定了。

对了,付上我写的shell脚本的源码:

date
w32tm /config /manualpeerlist:time.nist.gov /syncfromflags:MANUAL
w32tm /config /update
w32tm /resync
date
w32tm /config /manualpeerlist:time.windows.com /syncfromflags:MANUAL
w32tm /config /update
date #同步时间,因为新恢复的vultr快照的时间总是有问题,反正以前这个过程最恶心了,现在可以几行代码搞定

user="" #中转服务器的用户名
host="" #中转服务器的IP地址或者域名
extra="-p 22" #中转服务器的SSH端口
pass="" #中转服务器的用户名对应的密码
originalSite="" #源站点目录,就是源文件下载链接去掉文件名和斜杠的部分
transferDir="" #中转服务器的webroot
transferSite="" #中转服务器的站点地址,和上述参数对应着写

for file in `cat list`
do
downloadstr="cd $transferDir && wget $originalSite/$file"
sshpass -p "$pass" ssh -e none "[email protected]$host" $extra $downloadstr
wget "$transferSite/$file"
removestr="cd $transferDir && rm $file -f"
sshpass -p "$pass" ssh -e none "[email protected]$host" $extra $removestr
done

ssh -e none "[email protected]$host" $extra

这里用到了一个叫做sshpass的玩意来提供密码,不然脚本就会被中断。设置ssh密钥对于拖站来说过于麻烦,所以我没这么搞。但这个sshpass需要编译安装,我建议在本地的Cygwin(和服务器上的Cygwin位数需要相同,比如都是64位)编译好后,然后放某台服务器上,需要时wget+mv+chmod。

参照这篇文章的做法,可以这么搞:

apt-cyg install autoconf automake binutils cygport gcc-core make
git clone https://github.com/Edgar0119/cygwin-sshpass.git cygwin-sshpass
cd cygwin-sshpass
tar -zxvf sshpass-1.05.tar.gz
cd sshpass-1.05
bash ./configure
make && make install
# mv sshpass.exe /bin

还有脚本最后的那句ssh是用来添加服务器密钥的,反正第一次执行时肯定会出错,最后添加完密钥后再执行一遍就会恢复正常。反正我是想不出来比这个更好的办法了。现在真是炒鸡爽了,然而最近没有可以拖的东西,DDG最近全是萝莉片子,而且都是长得不萌的那种萝莉,除了无药可救放弃治疗的硬核萝莉控外谁会喜欢这种辣鸡。话说回来我一直好奇那些萝莉片子是从哪里来的,反正站长也不会说。

分类
未分类

如何在vultr帐号间转移快照

无解!至少按照官方给出的方法,无解。尽管vultr有宛如AWS一半般强大的快照功能(比如可以导入raw格式的快照,但没法导出),但我导出的raw格式反正就是不能用,无论放哪台服务器上都没法完整载入,每次只能载入1GB,这样恢复的instance当然不能用。这迫使我想别的办法。。。

好在vultr可以加载任意iso,既然可以加载Linux系统的livecd,而且livecd肯定带网络功能,那么我们可以用dd命令来搞:

先用源帐号开一个instance,操作系统选择需要转移的快照,开启后在iso library里面选择能用的iso,我之前是跟着这个教程搞的,所以选用了FreeBSD,你们也可以用别的,反正centos的盘不带livecd,ubuntu也不带。而且教程选用FreeBSD还是有点道理的,比如它的livecd启动之后会停留在选择安装还是使用livecd的选项,手残党福音。

然后想办法搞定网络问题,比如FreeBSD可以这样搞:

ifconfig vtnet0 [IP地址] netmask [子网掩码]

route add default [网关]

或者一句

dhclient vtnet0

也能搞定。

接下来就可以上dd大法了,用这么条命令:

dd if=/dev/vtbd0 bs=1m | ssh -e none [email protected] 'cat > nein.img'

很明显你需要另外一台VPS来存储镜像,最好和那台VPS在一个地区里面,直接在vultr里开一台就好了,但需要注意的是要比跑dd的机子高一级,不然空间不够。

搞定后会在中间服务器的/root目录下(或者/home/username,如果你没有用root用户的话)生成一个nein.img文件,大小等于那台VPS的磁盘大小,这就是所谓的raw格式的快照了。

按理来说我直接把这个文件扔upload snapshot里就搞定了,然而我发现它的存储快照的服务器居然在NY/NJ,我一新加坡的机子慢的1b,只好开一个洛杉矶的机子中转。但中转后仍然没解决没法完整载入的问题,所以我在想那个dd命令反过来写是不是就搞定了?

那么现在这么搞,在目标帐号里开一个和要转移的快照一样规格的instance(反正和官方快照恢复的方法一样,可大不可小),然后载入FreeBSD的iso,配置好网络,然后这么来:

ssh -e none [email protected] 'cat nein.img' | dd bs=1m of=/dev/vtbd0

刚好反过来,前者是将/dev/vtbd0(也就是vultr VPS的虚拟磁盘)的东西输出到stdout,然后通过管道接到ssh连接的另外一台服务器上,然后在那里作为stdin重定向写入到nein.img里。神奇的是这并非当dd读完盘之后再将这个几十GB的东西扔另外一台服务器上再写入,而是如同流水线一般同时进行的。而反过来的步骤就是用ssh连接另外一台服务器,在那里通过cat将nein.img的内容输出到stdout(然后就成了这台机子的stdout),通过管道直接接到dd的输入然后写入到/dev/vtbd0。反正感觉*nix世界简直屌爆了,如果这件事要winserver或者有网络的winpe做会如何,搞不好需要的额外体积就多出了不知多少GB了。Ghost之流好像可以备份到网络位置,但还是感觉比较恶心,比如还原的时候就不清楚能不能从网络位置还原了。总之现在我只需要坐看这坨东西什么时候搞完,反正我之前已经把镜像扔到vultr的洛杉矶节点了,而vultr的洛杉矶节点和新加坡节点之间的速度有些抽风(但也比别的方式好多了)。

然后完事之后重启,用vultr的方式建立快照,就这样完成了快照“转移”的过程。vultr官方还是让整件事情变得太蛋疼了。

之后又搞了一遍,这次全程只用新加坡的instances,iftop显示传输速度能上500Mbps,dd显示备份时37MB/s,恢复时57MB/s,反正源帐号的那两台instances都在一小时内搞完了,至于目标帐号的那台instance啥时候能搞完取决于vultr建立快照的速度(其实那个也在一小时内搞完了,而且再次恢复快照时只需10分钟,简直屌的1b)。还有我始终不明白vultr存储快照的服务器是只有NY/NY有,还是每个地区都有一个。

这个思路也可以用来搞其他用KVM技术的VPS商,哪怕他们没有快照,比如DigitalOcean,理论上来说只要他们的磁盘空间够就能搞。如果他们允许跑iso的话就好办了,不然的话我不清楚直接覆盖目标机器的linux系统会发生什么神奇的事情,是重启后直接变winserver还是根本启动不起来?还是会被DigitalOcean封号?鬼知道。

当然这种玩法还可以扩展地玩,比如找个便宜点的存储,毕竟新加坡这鬼地方没啥便宜的存储,也没有存储VPS用,但如果某里云的面向对象存储可以用HTTP方法来提取的话,而且如果它有新加坡节点的话,就可以试下用它来搞,再说了现在某里云有两个月的免费期,可以试着把快照放那儿。然后需要装个wget或者curl,输出到stdin,后面再接dd就搞定了。搞不好会比vultr自带的快照恢复要快(UPDATE:算了吧,存放费用按照25GB算只有0.5美元一个月,但我大致算了下流量费用,一个25GB的快照恢复一次就需要2美元,还是伤不起)。

UPDATE:其实我觉得应该还有更快的玩法,那就是不要中间服务器了,直接用dd命令在源服务器和目标服务器间对拷,理论上来说是可行的,命令如下:

dd if=/dev/vtbd0 bs=1m | ssh -e none [email protected] 'cat | dd bs=1m of=/dev/vtbd0'

但在这么搞之前,两台运行FreeBSD livecd的服务器都需要配置好,目标服务器除了需要配置好网络外还需要多出来一步:启用SSH server。

由于FreeBSD livecd的/etc位于只读文件系统,所以我们需要参照这个教程的做法,将其挂载到另外一个目录:

mkdir /tmp/etc
mount_unionfs /tmp/etc /etc
vi /etc/ssh/sshd_config # allow root login,就是将PermitRootLogin设成true,我就不吐槽FreeBSD的vi有多难用了
passwd root # Set a root password
service sshd onestart

然后就可以搞了。大功告成,在目标帐号的instance远程界面里出现了winserver2016的登录画面。

dd显示速度有35MB/s,对拷25GB的镜像需要765s,只需要一小时的六分之一,不错。

分类
未分类

random.17.08.11

我发现自从回到家后几个月干得不怎么样,除了confused的问题(一时半会儿恐怕无解)外,最大的问题在于我一天在电脑前十几个小时,真正有效率的时间恐怕只有两三个小时而已。大方向的问题我现在没办法(说不定以后我会有),但至少提升使用时间的效率是我现在可以做到的。

所以我计划将我一天至少12个小时在电脑前的时间划分成三个区间:

第一区间4个小时,运营新开的某宝店,每天上传一到两个虚拟产品;

第二区间也是4个小时,搞所谓自媒体的玩意,目前的做法是从外网拖搞笑视频(主要是epic fail系列),然后将其任意排列组合起来,这样我就可以用同一组视频发不同的所谓自媒体网站,目前我的想法就是这么肤浅。

剩下的时间我就可以自由发挥了,搞什么都行,可以用来看一些教程,逆向几个apk,或者纯粹用来打游戏都行。目前我的时间管理就是这么回事,这样的话搞不好我的12小时里面有10个小时算是有效率的,输出就是平日的5倍。

但大方向的问题我到现在还是无解,这个是最要命的问题,我要是早就解决了的话5月份的时候我就能有效用好我的时间。但现在既然已经是这个激霸样子,我还是先从强行提升效率开始吧,搞不好大方向这玩意搞着搞着就清楚了。

这只是个大致的草案,实际实施时会有一些弹性的变化,比如自媒体每天发5到10个,如果提前完成就不再折腾,而如果某宝店也提前搞定了的话那么剩下的时间全是自由时间。反之亦然。