其实在 cygwin 中弄 ssh 是为使用在 window 中使用 repo 。如果单纯为了在 window 上 ssh 登陆 linux 服务器的话,直接用 putty 就行了,简单方便,无需安装、配置。
从 cygwin web安装程序下载一个很小的 setup.exe ,然后第一选从网上安装(第一次装好后,会把安装文件缓存到你指定的目录,下次就可以选中从本地安装了)。如果选择从网上安装的话,之后会让你选择安装源(我选的163的那个,看上去就像是国内的源)。之后就会解析源信息(无论是在线的、还是本地的),如果出现说:提示你这个 setup.exe 有新版,然后出现解析失败的话,先要去它提示你的网址下载最新的 setup.exe,然后就会解析成功了。
最后一步是让你选择要安装的包,如果你硬盘够大,又不在意安装时间的话,可以全部选择安装(在那些分类上点击出现 install 就行了)。默认是 default,default 的话,它会安装一些最基本的 linux 的包(例如 bash 这些),然后如果是之前安装过的,default 是会保留你之前安装的包。所以如果你要卸载的话 ,就把它点成 uninstall,还有一个 reinstall 是重新安装。
这些我只是要用 repo 和 git (svn也算上吧)而已,所以把 Net 大类和 Python (repo要用 python)大类点上(点成 install 状态,然后点开看到具体的软件的版本号就算行了),然后在搜索栏上敲 ssh,把出来的也点上(一般就是 openssh),然后还可以点些自己需要的东西,例如 vim、unzip、sqlite 等。我为了省空间强制干掉了 X11、Gonme、KDE、Graphic、Audio 的东西,然后也没点啥编译的东西(gcc、make 之类的玩意,这些东西在 Devel 这个类下,想在 window 下要编 NDK 的要勾上这些了)。
选好后,点下一步就等进度条就行了。
ssh 的客户端不需要配置什么东西,直接 ssh username@host 就可以用。不过一上来就这么用的话,会发现会报啥 connect to xx port 22: Conection refused 之类的错误的。这个是因为你的 ssh 服务的守护进程没有启动(也就是 sshd)。我这里的配置大多数是网上的:
如果之前有配置过,但是配错了,想重新配置,就直接敲 ssh-host-config 就行了。但是如果想重新安装,可以用 sc delete sshd 这个命令先把之前安装的 sshd 服务给卸掉。如果创建了一些不想用的window用户,可以去 window 的控制面板去闪除。如果是 cygwin 的用户的话,你直接把 /etc/passwd 和 /etc/group 给删掉就好了,然后再用 mkpasswd -l > /etc/passwd 和 mkgroup -l > /etc/group 重新恢复默认用户和用户组就行了。记得重新分组后,要 chmod +r /ect/passwd 和 chmod +r /ect/group 改下权限,然后 rm -rf /var ,把这些临时文件给删掉。
其实就是直接敲 ssh-host-config ,只不过会一些选项让你选择而已:
$ ssh-host-config
*** Info: Generating /etc/ssh_host_key
*** Info: Generating /etc/ssh_host_rsa_key
*** Info: Generating /etc/ssh_host_dsa_key
*** Info: Creating default /etc/ssh_config file(如果这里之前安装过,会问你是否覆盖,选 yes 覆盖)
*** Info: Creating default /etc/sshd_config file (如果这里之前安装过,会问你是否覆盖,选 yes 覆盖)
*** Info: Privilege separation is set to yes by default since OpenSSH 3.3.
*** Info: However, this requires a non-privileged account called 'sshd'.
*** Info: For more info on privilege separation read /usr/share/doc/openssh/REAME.privsep.
*** Query: Should privilege separation be used? (yes/no) yes(这里的意思开启 sshd 需要一个有系统管理员权限的用户,说的是 window 的;问你是不是要单独创建一个这样的window用户,网上有说选no,有说选 yes 的,我是选 yes 的,可以启动 sshd)
*** Info: Updating /etc/sshd_config file
*** Info: Creating default /etc/inetd.d/sshd-inetd file
*** Info: Updated /etc/inetd.d/sshd-inetd
*** Warning: The following functions require administrator privileges!
*** Query: Do you want to install sshd as a service?
*** Query: (Say "no" if it is already installed as a service) (yes/no) yes(这里是问你是不是要安装 sshd 服务,肯定要选 yes,必须要装的)
*** Info: Note that the CYGWIN variable must contain at least "ntsec"
*** Info: for sshd to be able to change user context without password.
*** Query: Enter the value of CYGWIN for the daemon: [] ntsec tty(这里好像问的你是使用的终端连接方式吧,照网上的说法填 ntsec tty)
*** Info: On Windows Server 2003, Windows Vista, and above, the
*** Info: SYSTEM account cannot setuid to other users -- a capability
*** Info: sshd requires. You need to have or to create a privileged
*** Info: account. This script will help you do so.
*** Info: You appear to be running Windows 2003 Server or later. On 2003
*** Info: and later systems, it's not possible to use the LocalSystem
*** Info: account for services that can change the user id without an
*** Info: explicit password (such as passwordless logins [e.g. public key
*** Info: authentication] via sshd).
*** Info: If you want to enable that functionality, it's required to create
*** Info: a new account with special privileges (unless a similar account
*** Info: already exists). This account is then used to run these special
*** Info: servers.
*** Info: Note that creating a new user requires that the current account(这里第一次还会有个问题的,就是说如果你用的高于 window xp 的版本,就需要你重新创建一个有管理权限的用户,这个用户是 cygwin 的,这里选 yes,创建)
*** Info: have Administrator privileges itself.
*** Info: No privileged account could be found.
*** Info: This script plans to use 'cyg_server'.
*** Info: 'cyg_server' will only be used by registered services.
*** Query: Do you want to use a different name? (yes/no) no(这里创建的用户默认名字是 cyg_server 问你是不是要改名字,一般不用改)
*** Warning: Privileged account 'cyg_server' was specified,
*** Warning: but it does not have the necessary privileges.
*** Warning: Continuing, but will probably use a different account.
*** Warning: The specified account 'cyg_server' does not have the
*** Warning: required permissions or group memberships. This may
*** Warning: cause problems if not corrected; continuing...
*** Query: Please enter the password for user 'cyg_server': ******(然后让你为刚刚创建的 cyg_server 设密码)
*** Query: Reenter: ******
*** Info: The sshd service has been installed under the 'cyg_server'
*** Info: account. To start the service now, call `net start sshd' or
*** Info: `cygrunsrv -S sshd'. Otherwise, it will start automatically
*** Info: after the next reboot.
*** Info: Host configuration finished. Have fun!
最后出现这个提示就表示配置成功了。因为新创建了2个用户(一个 window 的,一个 cygwin 的),再用 mkpasswd -l > /etc/passwd 和 mkgroup -l > /etc/group 重新设置下用户信息。如果配置的过程中,出现创建用户不成功的提示,就用最开始说的,把之前创建的用户给删掉;还有在重新配置前先要停掉正在运行的 sshd 服务(net stop sshd)。
然后按提示的,使用 net start sshd 就可以启动 sshd 服务了。成功的话,会出成功的提示(cygwin bash 中文乱码的话,右键鼠标 --> options --> text 设置下编码可以解决)。然后在 window 的控制面板中的 系统安全 --> 管理工具 --> 服务 中可以看到一个叫 CYGWIN sshd 的服务,点开属性,登陆那里可以看到是使用刚刚创建的用户在启动的。
然后就可以使用 ssh user@host 来登陆了。如果使用密码登陆,记得把服务器的 /etc/ssh/sshd_config 中的 PasswordAuthentication 设置成 yes,如果使用密钥进行登陆就把 RSAAuthentication 和 PubkeyAuthentication 设置成 yes (具体使用密钥的方式,可以参看我的另外一篇叫 Rsa 验证的笔记)。
然后再记下,window 的 hosts 文件的位置在 C:\Windows\System32\drivers\etc 下,默认是隐藏、只读的系统文件。
最后,搞好 ssh 后,终于可以在 window 下用 repo 和 git pull、push 或是 sync 代码了。