东东东 陈煜东的博客

作者: 东东东 ( 2 / 19)

Sublime Text预览Graphviz图

经常用Sublime Text来进行画Graphviz图,如果每次用命令行来进行预览就麻烦了。这个时候当然要利用热心的网友提供的插件了。

下载安装Graphviz

Windows下载Graphviz,解压到一个路径下,然后把其bin目录加入到环境变量中。在cmd中dot -V来验证是否可以使用dot编译了。

Linux请使用系统自带的包管理程序来安装atp-get install graphviz,和Windows同样的验证方法。

自动安装插件不兼容Windows

打开Package Control来搜索了一下graphviz,还真的发现了一个插件GraphvizPreview。于是安装它,发现并不能用。使用快捷键win + shift + g 出现

Graphviz: Could not open PDF, only works for Mac… fork this repo for your OS!’

什么情况,插件只能支持Mac,不支持Windows。

上官方的github的issue搜索看了下,有人已经提交了Windows版本的修复,可是Package Control的版本还是很老的,没有把master的版本进行更新。所以通过release版本下载的是2014年4月份的v0.1.1版本,而Windows的修复版本是在2015年2月份。

所以只能通过下载master来进行手动安装。

手动安装步骤

第一步:下载https://github.com/munro/SublimeGraphvizPreview/archive/master.zip 第二步:打开Preferences -> Packages Settings -> Packages Control -> Settings User,来确认一下installed_packages没有GraphVizPreview。并且增加"remove_orphaned": false防止Sublime Text 把手动安装的插件包给删除了。

{
    "bootstrapped": true,
    "in_process_packages":
    [
    ],
    "installed_packages":
    [
        "EncodingHelper",
        "Package Control",
        "Theme - Spacegray"
    ],
    "remove_orphaned": false
}

第三步:打开Preferences -> Browse Packages...进入到Sublime Text的插件包下Packagas

第四步:解压zip文件到Packagas下,并且更改文件夹SublimeGraphvizPreview-masterGraphVizPreview

第五步:重启Sublime Text。

效果图预览

参考

分类: 实用技巧

sudo保持前用用户的env环境变量

在虚拟机里安装了一个Ubuntu,在局域网下,需要设置代理才能访问网络和安装程序。很自然的给sudo vim /etc/bash.bashrc添加代理。

# 设置代理
export http_proxy=http://web-proxy.oo.com:8080
export https_proxy=http://web-proxy.oo.com:8080
export no_proxy=localhost,.oo.com,.local

然后很愉快的sudo apt-get update发现根本无法连接服务器。如果切换到sudo su的root用户下,是可以的执行的。

研究了半天,原来是sudo在切换成root用户的时候,env并不会去保留这些环境变量,需要特别的指明才可以。

通过visudo命令来设置,需要保留的环境变量,新增下面的第10行。Defaults env_keep="http_proxy https_proxy ftp_proxy no_proxy DISPLAY XAUTHORITY"。这样就可以继续愉快的访问网络了。

#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults        env_reset
Defaults        env_keep="http_proxy https_proxy ftp_proxy no_proxy DISPLAY XAUTHORITY"
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

友情提示。只能通过visudo命令来更新,不能修改/etc/sudoers文件,会被覆盖的。

分类: 未分类

发现一个漂亮的IDE皮肤spacegray

偶然经过WEB开发的座位,发现的他的编辑器很漂亮,问了一下是什么编辑器。原来是Sublime Text,求问是什么皮肤,回答是spacegray

Sublime Text 中的spacegray

sublime text spacegray theme

sublime text spacegray theme

个人在皮肤上做了一些设置。使得更适合我

{
    "color_scheme": "Packages/User/base16-eighties.dark (SL).tmTheme",
    "theme": "Spacegray.sublime-theme",

    "highlight_line": true,

    "spacegray_sidebar_font_xlarge": true,
    "spacegray_sidebar_tree_large": true,
    "spacegray_tabs_auto_width": true,
    "spacegray_tabs_font_large": true,
    "spacegray_tabs_xlarge": true,

    "line_padding_bottom": 3,
    "line_padding_top": 3
    ....
}

获取地址:http://kkga.github.io/spacegray/

jetbrains系列中的spacegray设置

spacegray-pycharm 经过我修改后的样式

spacegray-pycharm 经过我修改后的样式

我是从https://github.com/abhimanyusharma003/phpstorm-spacegray上面下载,并根据自己的喜好做了一些变化的。因为默认的颜色有的地方感觉不好看。

我的变更:

  • 当前光标行高亮
  • 选中文字颜色默认是白色,我把它去除了
  • 选中的背景色太亮,把它调的更灰一些。
  • 普通变量文字颜色太灰,和注释的一些灰,不好区分,调的更白色一些

我的配置设置下载myspacegray-pycharm.jar

另外还有一个ocean的皮肤我也觉得很漂亮,http://www.ideacolorthemes.org/themes/96/但是有些颜色也不容易区分。

从jar包导入配置的方法

jetbrains系列从jar包导入配置的方法。

  1. 选择编辑器FileImport Setting
  2. 重启
  3. 在设置中EditorColors and fonts,选择一个主题

分类: Programming

uwsgi python home设置

运行uwsgi,发现500错误,一看uwsgi的log。

ImportError: No module named random

一看就奇怪了,标准的python的类库,怎么就不支持呢?

一看原来以前的uwsgi配置里面有个,现在没有了。

./uwsgi ./uwsgi.ini -H /usr/local/services/python

增加一个PYTHONHOME的环境变量,

export PYTHONHOME=/usr/local/services/python

就可以把这个配置给取消了。

因为这个python不是标准的安装,所以这些都没有设置。

git与svn 共舞

Git好用,但无奈历史原因,整个项目还得继续使用svn,但是又想使用Git的特性,所以尽力地去追求Git与svn的协作。

git svn命令

Git 中所有 Subversion 桥接命令的基础是 git svn 。所有的命令都从它开始。相关的命令数目不少,本文不过多介绍git svn的命令使用,只简单的说明一下最常用的几个,更多的知识参考书记pro git。

整理用户名与Email的映射

在 Subversion,每个提交者在都在主机上有一个用户名,记录在提交信息中。如果想让已有的信息更好的映射到 Git 作者数据里,则需要 从 Subversion 用户名到 Git 作者的一个映射关系,因为Git是用邮箱来标识一个提交者的。建立一个叫做 user.txt 的文件,每行一条svn作者 = 作者昵称 <邮箱地址>,用如下格式表示映射关系

schacon = Scott Chacon <schacon@geemail.com>
selse = Someo Nelse <selse@geemail.com>

SVN代码的所有提交者的作者名可以通过以下命令获得:

svn log --xml | grep "^<author" | sort -u |  \
         awk -F '\<author\>' '{print $2}' | awk -F '\</author\>' '{print $1}' > user.txt

得到以下文本,然后根据以上的格式编辑作者的邮件信息等。

schacon
selse

这样我们的把有svn的提交记录的作者、邮箱user.txt都准备好了,接下来就克隆svn的地址。

克隆svn的trunk到本地

git svn clone http://example.com/path/to/project-x/trunk   \ 
              --authors-file=users.txt  project-x
  • http://example.com/path/to/project-x/trunk是svn的项目地址,这里用了trunk的目录。
  • --authors-file=users.txt是指明svn的作者信息,git要用到。
  • project-x是文件夹名字
  • --no-metadata参数可以不要svn的信息,适合迁移的时候使用,不适合git svn共用,见下面的小节

如果你的项目很大,这一步是非常缓慢的。因为Git会去把整个提交记录遍历过去,然后对svn的每次提交多做一个补丁,产生一个git提交。特别是到了84000的时候感觉是假死的情况,其实只要慢慢等待就可以了。

no-metadata去除不爽的git与svn的关联信息

使用这个参数,请认真阅读本片段。

如果没有使用 --no-metadata来克隆svn项目,那么如果输入git log将会看到一堆“没用的东西”:

commit 37efa680e8473b615de980fa935944215428a35a
Author: schacon <schacon@4c93b258-373f-11de-be05-5f7a86268029>
Date:   Sun May 3 00:12:22 2009 +0000

    fixed install - go to trunk

    git-svn-id: https://my-project.googlecode.com/svn/trunk@94 4c93b258-373f-11de-
    be05-5f7a86268029

如果使用--no-metadata参数,那么得到的提交信息是这样的:

commit 03a8785f44c8ea5cdb0e8834b7c8e6c469be2ff2
Author: Scott Chacon <schacon@geemail.com>
Date:   Sun May 3 00:12:22 2009 +0000

    fixed install - go to trunk

是不是变得清爽了呢?那么git-svn-id这个东西到底是做什么用的呢?

原来git-svn-id是记录git的提交与svn的提交的关联关系。如果没有这个,那么你只能在git上的提交,无法提交到svn。

建议:如果是你想向svn提交,那么不要使用这个参数。如果你只是迁移svn的历史记录到Git中,那么请开启这个参数。

设置Git的参数

之前我们把svn的代码拉取到本地来了,接下来要设置一下远程仓库的配置

cd project-x

# 设置远程仓库的url地址,如果你的是ssh的方式,又可能不一样了。
git remote add origin http://git.code.com/url/project-x.git

# 设置git的提交用户名和邮箱
# --global参数是全局设定,如果是想当前项目设置,那么去除这个参数
git config --global user.name youname
git config --global user.email email@email.com

从svn获取更新

刚刚我们git svn clone下载了svn的源码,但是如果有人提交了svn的代码,那么我们这个时候还要继续拉取svn的代码。

# 从svn拉取代码。这个事实拉取代码到本地,并没有合并到本地的分支来。
git svn fetch
git checkout master
git svn rebase
# svn update = git svn fetch + git svn rebase

这里检出master分支,去做一次拉取svn并合并代码的操作,理想的情况下使用其他的分支,不一定是master分支。 然后用rebase把提交记录应用到分支上,构成一个线性的提价记录。

我有好多个分支怎么办?

我们一开始都默认值选择了一个分支,我如果想获取多个分支怎么处理呢?

向svn提交代码

假设你在分支feature分支上做开发,没有提交到master分支上。那么有两种方法提交到svn。

  • 保留feature分支所有的提交记录
  • 压缩feature分支的提交记录,变成一个提交记录。

保留个人的提交记录

svn和git分支概念不一样,你要把git的提交推动到svn的代码库中也非常的简单。只需要使用rebase命令到跟踪svn的那个分支上就可以了。然后执行dcommit提交到svn服务器。

git checkout master  # 先拉取svn的代码
git svn rebase
git checkout feature123  # rebase 到master分支上
git rebase master
git checkout master
git merge feature123   # 使用fast-forward合并,让master指针指向最新的提交
git svn dcommit        # 推送到svn服务器

压缩个人的提交记录

和上一种提交没有什么区别。唯一的区别就是在如果你拉取了一个分支feature123,并且没有人在master上面做任何的提交,那么可以使用merge来进行fast-forward快速合并(这样子是不会压缩为一个提交记录的)。然后提交到服务器。

另外一种情况是,他人在svn的分支上提交代码了,你也在master的基础上提交代码了。这个时候git没办法进行fast-forward快速合并,只能进行merge 三方合并。这个时候会把之前的提交记录变成一个提交。然后推送到服务器上。

git checkout master  # 先拉取svn的代码
git svn rebase
git merge feature123     # 这里可能是fast-forward合并,也可能是三方合并。
git svn dcommit          # 推送到svn服务器

使用心得

git与svn协同,这种方式用的比较麻烦,又要使用svn又要使用git。只是有这种需求的人,都是项目还在svn管理。建议将整个项目使用git提交信息,但是最后推送到svn的tag目录下。

参考

分类: 实用技巧

laravel session的使用,填一下坑

用Laravel开发应用,把原有的代码copy过来,以前的代码session使用了$_SESSION,本以为移植过来可以很好的运行的,因为没有依赖其他的组件,结果出现了这个

Undefined variable: _SESSION

Laravel的session的配置文件配置在 app/config/session.php 中,使用时可以看看 session 配置文件中可用的选项设定及注释。

Laravel 默认使用 file 的方式来实现 session的。她并不用php原生的$_SESSION(php原生的session要看php.ini的位置),所以忽略php相关的session函数,例如session_start(), $_SESSION。Laravel在运行过程中会在app/storage/session/目录写入session的信息,所以这个目录需要有写权限,否者session就无法写入成功。

Laravel除了使用默认的file作为session的实现,还支持cookie, Memcached, Redis数据库的后端驱动作为session的实现。必要的时候还需要自己实现一个session的实现方式,比如在微信公众账号和用户的交互,这中session就无法直接使用,因为每次都是微信服务器来请求,无法通过请求的来源来辨别用户。

laravel的session简要API

Session的API还是比较简单的,大家看看中文文档也大概知道是怎么个意思。但是有那么几个还不太好理解。

//session的永久保存(在不过期范围内)
Session::put('key', 'value');

//等同于PHP的原生session
$_SESSION['key'] = 'value';

//get操作
$value = Session::get('key', 'default');

//去除操作并删除,类似pop概念
$value = Session::pull('key', 'default');

//检测是否存在key
Session::has('users');

//删除key
Session::forget('key');

这个对应只要session不过期,基本上是永久保存,下次http请求也是存在的。不同于下面的flash概念。

laravel的session中flash概念

但是Laravel出了个快闪flash的概念,把我一下子给搞混了。这个flash两次请求有效(本次和下次请求有效),与本次请求取操作多少次无关。

//保存key,value
Session::flash('key', 'value');

//取值方法还是一样的
Session::get('key');

//刷新快闪数据时间,保持到下次请求
Session::keep(array('username', 'email'));

这个flash的概念和上面的put的概念不太一样。

  • put :这个对应只要session不过期,基本上是永久保存,下次请求也是存在的。
  • flash :保存的值,本次请求可以使用,下次http请求可以使用,再下一次就不存在了。

也就是说下一次的请求用完就被销毁了,不会让session的值变的越来越大,可以保存一些临时的数据。

这中情况的使用场景比如有:

  • 用户请求了页面,出现错误信息,重定向到一个新的页面,需要展示之前的数据。(虽然可以通过url参数来传递,处理不好可能会有xss漏洞)。
  • 用户访问了一个页面,过滤器发现没权限,保存当前页面url,重定向到登录页面,登录成功,取出值,重定向到原先的页面。(这里可能需要刷新保存的快闪数据)

session落地的时间

我天真的以为使用了Session::put函数就能保存这个变量了。于是我的代码这样写:

class LoginController {

    public function login(){
        Session::put('key','value'); 
        print_r( Session::all() ); //取出来看看是否put成功
        exit;   //习惯性的调试都exit,不执行后续代码
        //return Redirect::to(/); 框架在return后还会有后续的代码执行的
    }
}

结果下次请求就是找不到本次的Session,而且看app/storage/session目录就是没有文件生成。总感觉不对劲啊。

后来看到网络上有个方法Session::save(),于是我也用了下,居然发现成功的生成了session的文件。于是我感觉到,Laravel不用php原生的session,那么在controller之后应该做了一些事情,将session写入到文件中,而不是每次put操作都写操作,这样会IO操作太频繁的,影响性能的。

查看调用相关的代码。laravel编译后,在bootstrap/compiled.php

class Middleware implements HttpKernelInterface
{
    ...
    public function handle(Request $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = true)
    {
        $this->checkRequestForArraySessions($request);
        if ($this->sessionConfigured()) {
            $session = $this->startSession($request); // 启动session
            $request->setSession($session);
        }
        $response = $this->app->handle($request, $type, $catch); // 调用controller的method
        if ($this->sessionConfigured()) {
            $this->closeSession($session);         //关闭session
            $this->addCookieToResponse($response, $session);
        }
        return $response;
    }
    ...

    protected function closeSession(SessionInterface $session)
    {
        $session->save();    // 保存session
        $this->collectGarbage($session);
    }
}

小提示:如果不知道函数调用情况,可以在controller中throw new Exception();,然后在/config/app.php的debug更改为debug=>true。可以看到函数的调用关系。

可以看见,在调用完controller之后,调用了session->save()的方法,来主动的保存session。这样session才能落地保存起来,如果在controller或者view里面写了exit;,那么session是不会被保存的,除非主动的写Session::save()才能手工的保存起来。因此在debug调试的时候千万要注意啊。

分类: PHP

mysql执行SQL导出数据

访问MySQL数据库除了可以使用phpmyadmin、第三方数据库客户端,也可以使用命令行的MySQL客户端,因为敲命令不太方便,所以被很多人给抛弃呀。

但有时候没办法,phpmyadmin不能用,只能使用命令行模式了,不过用多了,感觉命令行的也不错,除了写SQL比较慢。

基本命令

mysql -h hostip -P port -u usernmae -p passwd dbname -A
    -h mysql的ip
    -P 端口
    -u 用户名
    -p 密码
    dbname 数据库名    直接进入数据库,不用use dbanem了
    -A   ,--no-auto-rehash 不自动重新进行哈希运算。
               该选项使mysql启动得更快,但果你想要完成表和列名,你必须发出rehash命令。

登录MySQL

# 访问本地的test数据库 
mysql -h127.0.0.1 -P3306 -uroot -proot test  -A     

对数据库执行sql文件,导入数据

# 执行sql.sql文件,一般做导入数据使用
mysql -h hostip -P port -u usernmae -p passwd dbname < sql.sql

执行sql导出数据到文件

# 执行sql.sql文件里的sql语句,然后将数据导出到/tmp/data文件中
# 数据tab分隔,没有列名
cat sql.sql | mysql -h hostip -P port -u usernmae -p passwd dbname > /tmp/data

导入excel使用tab分隔数据就可以了。

将MySQL交互的文本保存到文件

# 将mysql客户端输出的文本保存到文件
mysql> tee /tmp/textdata  # 设置要保存的文件
Logging to file '/tmp/textdata'
mysql> select * from user;
cat /tmp/textdata

这样在/tmp/textdata就可以看到刚刚输出的文本,通过这种方式也能导出数据。

分类: Programming

uwsgi log rotate按天切割日志

uwsgi和nginx的log一样都是在一个文件名上写log,无法按天进行rotate,所以单个文件的体积会越来越大,不利于log的备份。

nginx的log切分方法

在网络上研究了nginx的log切分方法,原理比较简单。

  1. 先重命名文件,mv access.log access-20150215.log
  2. 然后reload一下nginx。
  3. nginx继续在access.log上写log

我想这种方法也是应该可以应用到uwsgi上面的。但是没有那么容易。

尝试应用到uwsgi

  1. 先重命名文件,mv uwsgi.log uwsgi-20150215.log
  2. 然后reload一下uwsgi。
  3. 没有看到uwsgi.log文件

与想象中的完全不一样。发现uWSGI的reload操作根本重不会新打开log文件。这样就需要变更一下思路了。

解决方案一

参数touch-logreopen可以重新打开日志。

logto = /data/log/MODULE/uwsgi.log
touch-logreopen=/data/log/MODULE/.touchforlogrotate

touch-logreopen当指定的文件被touch过后,时间戳发生变化,会让uWSGI重新打开日志文件,并且不会终止当前的服务(不是stop+start,而是reload的概念)。

#!/bin/bash

module="module_name"
DIR=`echo $(cd "$(dirname "$0")"; pwd)`       #获取当前目录 
LOGDIR="/data/log/$module/"                   #log目录

sourcelogpath="${LOGDIR}uwsgi.log"            #log源地址
touchfile="${LOGDIR}.touchforlogrotate"       #需要touch的文件

DATE=`date -d "yesterday" +"%Y%m%d"`
destlogpath="${LOGDIR}uwsgi-${DATE}.log"     #重命名后的文件
mv $sourcelogpath $destlogpath

#echo $touchfile
touch $touchfile                             # 更新文件时间戳

然后在crontab中加入这个,让每天0点0分的时候切分日志,当然了也可以23点59分,不过要更改一下shell脚本。

00 00 * * * /data/you_module_name/bin/uwsgirotate.sh  > /dev/null 2>&1

当然了,也可以不用crontab,如果你有logrorate服务,可以往里面添加一些事件,来进行日志的滚动。

解决方法二

官方说参数log-maxsize <bytes>,可以让uWSGI的日志文件达到一定大小后重新打开。不过我记得当达到一定大小后,并没有重新写入到uwsgi.log文件中,比较奇怪。而且按日志大小来切分,感觉没有按时间来切分的好。

解决方案三

使用参数log-master,让主进程监听一些信号,当想master进程发送信号后,日志就会重新打开,这个也是要配合mv操作先更改文件名才能的。具体参考官方的使用。The Master FIFO

分类: Web 开发

手机qq WebView网页控制面板设置

现在微信的WeixinJSBridge可以控制微信内置浏览器的一些界面UI,甚至还可以调用微信的一些组件,比如摄像头、打开公众账号等等操作,那么手机QQ是否也有类似的JS接口呢?

答案是:有,但还不对外开放。

我问了手机QQ的JS接口开发人员,要想使用MobileQQ JS API是有域名权限控制的。目前还只能腾讯业务使用,将来或许会开放到QQ开放平台到,但是接口不会一下子放出来,会慢慢的放开来给普通开发者使用。看了下他们mqq的JS API接口,写的文档还不错。期待他们的对外开放。

但是,虽然不能使用手机QQ的JS API接口,但是官方还是有一些方法能够隐藏手机QQ内置浏览器的底部导航等等。具体的实现方式不能使用JS来控制,而是通过URL来控制。

定制webview

webview是什么?简单的理解就是手机QQ的内嵌浏览器吧。

使用方法

只需在url上添加一个名为_wv的参数即可配置不同的UI:

http://www.domain.com/uri?...&_wv=N

其中N是各种组合之和,例如N=5=1+4,表示有1和4的效果。具体的值有:

  • 1: 隐藏【底部导航】(隐藏后『返回按钮』功能变为『页面后退』, 可以配合4使用)
  • 2: 隐藏【功能菜单】
  • 4: 在隐藏【底部导航】的情况下,『返回按钮』直接关闭页面
  • 8: 隐藏【功能菜单】里的【分享给好友】项
  • 16: 隐藏【功能菜单】里的【分享到QQ空间】项
  • 32: 隐藏【功能菜单】里的【复制链接】项
  • 64: 隐藏【功能菜单】里的【查看帐号资料】项[4]
  • 128: 隐藏【功能菜单】里的【调整字体】项
  • 256: 隐藏【功能菜单】里的【用系统浏览器打开】项
  • 512: 隐藏【功能菜单】里的【用QQ浏览器打开】项
  • 1024: 锁定竖屏模式(禁用横屏)
  • 2048 [未实现]: 锁定横屏模式(禁用竖屏)
  • 4096 [iOS]: 禁用向右滑动关闭WebView的手势
  • 8192: 隐藏【功能菜单】里的【收藏】项
  • 16384:(4.7+) 隐藏【功能菜单】里的【分享到微信】
  • 32768:(4.7+) 隐藏【功能菜单】里的【分享到朋友圈】
  • 65536:(4.7+) 禁用webveiw缓存
  • 131072:(5.3+) 全屏
  • 262144:无用
  • 524288:(5.3+) activity 透明
  • 1048576:(5.3+) 忽略登录态(不种入登陆态)
  • 2097152:(5.3+) 忽略多层返回时显示”关闭”按钮

一些特殊的情况

Android下,当没有设置_wv参数时,默认为_wv=4,因此【返回按钮】行为是退出整个webview,当设置了其它不包括4的值,譬如_wv=1024(禁用横屏)则返回按钮行为是【页面回退】。

分类: Web 开发

tortoisegit使用密钥连接服务器

git是个好东西,tortoisegit也是个好东西。在Windows下使用tortoisegit用的比较多,而对命令行的时候比较少。

对于tortoisegit可以支持使用密钥有两种,一种是支持openssh的密钥,一种是支持putty的密钥。但是这两种不同,对于Linux的ssh一般都使用openssh,但是没关系,我们可以转换。

使用putty的密钥

我们来看看这样方式,在安装TortoiseGit的时候其实会让你选择默认使用的ssh客户端,默认情况下是使用TortoiseGitPlink这个客户端。

指定ssh的客户端为TortoiseGit

生成putty密钥

在安装tortoisegit的时候,默认还会安装有Puttygen.exe这个程序,这个程序是可以生成putty密钥的。

点击Generate按钮后会按一个进度条,然后鼠标不断在该程序内动,目的是生成一些随机数。

我第一次使用鼠标傻傻的不动,然后进度条非常的缓慢,我想这个东西生成一个密钥那么慢?原来是我打开的方式不对。

putty密钥生成

点击save private key保存putty的私钥,putty的密钥的后缀名是ppk。

在服务器上添加openssh公钥

我们在上面创建了putty的密钥对,现在需要将生成的公钥添加到服务器上。

其实这里也可以把公钥添加到github.com上,也是可以使用的。 putty生成的公钥是和openssh的的公钥是相同的,他们只是私钥不同

假设刚刚生成的公钥是

ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAi1vfwiNbamTPUOSpEWvQDYrefFcuPkUuZe5Y6r4l/xEAv7e9f5QDr6QEo215r2qBBnuixAgzpjZPSvr7S51qinuq6EyXm4kFGIW6B/L4zVjx5DKxofTno39xe58QQnAixoHNN9ccNhetcxEjp7gORo1k7AMuMuQY7V/6aekiOPfh6QsWuUMf6HZhZMqpu3q3xAqHlmOU5emAif4bQKZFghEYOftHZH+E+Yo+ed65KtOJ+V5PjPxD6RMGfx3A7MhsV5PXDijD7yu0b33r+mEDLoqRO1RDQUoviryBbuE4Gcu63a3J8+3GifXbrXOHzlMipAYtHxHjg5XuLGENlEmodw== rsa-key 

登录到服务器的需要添加公钥的用户名下,比如user1这个用户名。

cd /home/user1/
mkdir .ssh                   #如果这个目录不存在
touch .ssh/authorized_keys   #如果这个文件不存在
chmod 600 .ssh/authorized_keys  #设置一下文件的权限 
echo "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAi1vfwiNbamTPUOSpEWvQDYrefFcuPkUuZe5Y6r4l/xEAv7e9f5QDr6QEo215r2qBBnuixAgzpjZPSvr7S51qinuq6EyXm4kFGIW6B/L4zVjx5DKxofTno39xe58QQnAixoHNN9ccNhetcxEjp7gORo1k7AMuMuQY7V/6aekiOPfh6QsWuUMf6HZhZMqpu3q3xAqHlmOU5emAif4bQKZFghEYOftHZH+E+Yo+ed65KtOJ+V5PjPxD6RMGfx3A7MhsV5PXDijD7yu0b33r+mEDLoqRO1RDQUoviryBbuE4Gcu63a3J8+3GifXbrXOHzlMipAYtHxHjg5XuLGENlEmodw== rsa-key" \
    >> .ssh/authorized_keys    #这个和上面是同一行的
注意:公钥在authorized_keys的文件形式是一行一个公钥,切记。否则该公钥不起作用。

在tortoisegit上使用密钥

公钥已经添加到服务器去了,接下来就是在客户端上设置密钥了。

git clone的时候使用,如下设置:

git clone设置putty私钥

这样就可以搞定了。

putty密钥与openssh密钥转化

如果你有putty的私钥了,但是想在ssh客户端下使用openssh的私钥,再去生成一个openssh的密钥对比较麻烦(能偷懒就偷懒嘛)。

  1. 点击Conversions菜单项中的Import key
  2. 选择一个putty的私钥或者openssh的私钥
  3. 点击save private key保存为putty的私钥
  4. 或者点击菜单Conversions->Export OpenSSH Key保存为openssh的私钥

SSH登录一直失败

如果SSH登录一直失败,看看是否权限会有些问题?参考ssh密钥登录失败

相关资料

  1. OpenSSH密钥对的生成
  2. 在命令行下使用多个OpenSSH私钥
  3. tortoisegit下载
  4. windows下的git下载

分类: Programming

较早的文章 较新的文章

Copyright © 2017 东东东 陈煜东的博客 粤ICP备13059639号-1

SITEMAP回到顶部 ↑