东东东 陈煜东的博客

分类存档: Programming ( 1 / 2)

发现一个漂亮的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,选择一个主题

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: 发现一个漂亮的IDE皮肤spacegray – https://www.chenyudong.com/archives/spacegray-on-sublime-theme-pycharm-theme.html

分类: Programming

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就可以看到刚刚输出的文本,通过这种方式也能导出数据。

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: mysql执行SQL导出数据 – https://www.chenyudong.com/archives/mysql-dump-data-by-shell.html

分类: Programming

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下载

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: tortoisegit使用密钥连接服务器 – https://www.chenyudong.com/archives/tortoisegit-use-key-authentication.html

分类: Programming

MySQL的insert ignore与replace into不同

以前从来没有接触过replace into这个语法,但是却看到很多人都在使用这个语法,并且应用在很多生产环境中,于是我也去学习了一下repalce into的用法。

关于replace

一句话:正常情况下表中有PRIMARY KEYUNIQUE索引,新数据会替换老的数据。没有老数据则insert该数据。

REPLACE的运行与INSERT很相像。只有一点除外,如果表中的一个旧记录与一个用于PRIMARY KEY或一个UNIQUE索引的新记录具有相同的值,则在新记录被插入之前,旧记录被删除。使用REPLACE相当于对原有的数据(在PRIMARY KEY或UNIQUE索引下有值的数据)进行delete操作,然后再insert操作。为了能够使用REPLACE,您必须同时拥有表的INSERTDELETE权限。

除非表有一个PRIMARY KEY或UNIQUE索引,否则,使用一个REPLACE语句没有意义。该语句会与INSERT相同,因为没有索引被用于确定是否新行复制了其它的行。

replace的使用一般是:只想对数据在数据库中保存一份,不想出现重复的数据(重复的主键、唯一索引),因为重复的数据不是我们想要的,会给业务逻辑带来麻烦。但是又要更新一些字段为最新的值,比如最后的检查时间、任务的结果。

关于insert ignore

一句话:忽略执行insert语句出现的错误,不会忽略语法问题,但是忽略主键存在的情况。

如果没有ignore关键字,那么在insert数据到一个表(在UNIQUE索引PRIMARY KEY有相同值)中,这时会出现错误,语句执行失败。但是使用了ignore关键字后,不会出现这个错误,并且新数据不会被插入到数据表中。

使用场景:比如一个多线程的插入数据表,为了不让多个线程向表中插入相同的数据,可以使用insert ignore来忽略重复的数据。有比如,你的程序down了,需要重新运行,那么会重新拉取数据再insert到数据库中,这个时候可能会存在重复的数据导致错误,ignore就可以解决这个问题。

两者的一些联系区别

联系:

不想向数据表中插入相同的主键、unique索引时,可以使用replaceinsert ignore,来避免重复的数据。

区别:

  • replace相当于delete然后insert,会有对数据进行写的过程。
  • insert ignore会忽略已经存在主键或unique索引的数据,而不会有数据的修改。

使用场景:

  • 如果不需要对数据进行更新值,那么推荐使用insert ignore,比如:多线程的插入相同的数据。
  • 如果需要对数据进行更新最新的值,那么使用replace,比如:任务的结果,最后的更新时间。

后话:自从知道了有insert ignore,我再也不会一股劲的使用replace了,妈妈再也不用担心数据库的频繁删写操作。

参考资料

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: MySQL的insert ignore与replace into不同 – https://www.chenyudong.com/archives/mysql-insert-ignore-different-replace-into.html

分类: Programming

将sublime text添加到右键菜单中

使用的是免安装便携版的Sublime Text,所以右键加入菜单这样的事情也就是能自己手动来设置了。

将下面的代码保存为*.reg的文件,然后导入到注册表中,这样就可以在右键的菜单中打开文件或者文件夹了。

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell\SubLime]
@="edit with Sublime Text"

[HKEY_CLASSES_ROOT\*\shell\SubLime\Command]
@="E:\\Program Files\\Sublime Text 2\\sublime_text.exe \"%1\""

[HKEY_CLASSES_ROOT\Directory\shell\SubLime]
@="edit with Sublime Text"

[HKEY_CLASSES_ROOT\Directory\shell\SubLime\Command]
@="E:\\Program Files\\Sublime Text 2\\sublime_text.exe -a \"%1\""

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: 将sublime text添加到右键菜单中 – https://www.chenyudong.com/archives/content-menu-edit-width-sublime-text.html

分类: Programming

我常用的电脑设置和程序

有时候会重装系统,记录一下常用的程序,将来方便查找

程序

必备

编程相关

一些软件

  • 办公:Office、Visio、Adobe Acrobat 9.0
  • 图像:PhotoShop、Snagit
  • 思维导图:Mindjet、FreeMind
  • 代理:BitviseSSH、myentunnel
  • 端口转发:PassPort

配置

  • 关闭Windows无用的安全系统、自动更新等服务
  • 虚拟内存放置到其他盘
  • 将sublime添加到右键菜单
  • 开发规范
    git关闭autocrlf,git config --global core.autocrlf false
    所有编辑器使用Unix换行符
    设置使用空格代替tab键

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: 我常用的电脑设置和程序 – https://www.chenyudong.com/archives/my-favorite-setting-and-programs.html

分类: Programming

在公司的局域网使用git或github 设置代理

在公司这样的局域网环境中,向要走网络必须走HTTP代理出去。不能直接访问外面的服务,所以这样安全了些,但是也提供了不便的地方。因此需要设置一些代理才能使用。

常用的代理有:

  • HTTP、HTTPS代理 许多程序支持http代理
  • SOCKS代理 不是所有的程序都支持socks代理,但是常用的软件都支持

github上的仓库支持ssh、https、git三种协议的chekout(clone)操作。

生成SSH Key

参考http://www.chenyudong.com/archives/ssh-using-private-public-key-no-password.html进行SSH密钥的生产

git使用http访问

github上可以使用https进行访问。

$ git config --global http.proxy http://web-proxy.oa.com:8080

但是这样可以clone了。但是如果要push代码,那就麻烦了。每次都需要输入密码。

git使用ssh进行访问

使用ssh协议不仅可以访问github,还可以访问我们自己的git私有仓库,可以参考文章通过SSH创建私有git仓库

首先,Windows用户先下载一个mysgit客户端,下个portable版的就好了,https://github.com/msysgit/msysgit/releases里面有git程序。Linux用户跳过。

第二步,配置ssh。Windows用户运行mysgit中的git-bash.bat来启动终端。编辑vim ~/.ssh/config ,将下面的内容写入到文件中

Host github.com *.github.com
    ProxyCommand connect -H web-proxy.oa.com:8080 %h %p   #设置代理
    IdentityFile ~/.ssh/privatekey/id_rsa      # 这里是私钥,不要放成公钥啦
    User git

一定要注意IdentityFile这里要使用私钥,不能写错了。不然会让一直输入密码

Enter passphrase for key '/root/.ssh/id_dsa.pub':

参考自:http://superuser.com/questions/508408/public-key-always-asking-for-password-and-keyphrase

ProxyCommand说明了设置代理,其中connect是个程序,Windows用户下载了mysgit,里面有这个程序,Linux用户可能没有,需要安装sudo apt-get install connect-proxy。Centos系列可能yum install connect-proxy没有收录,需要自行下载http://rpm.pbone.net/index.php3?stat=3&search=connect-proxy&srodzaj=3

如果你使用corkscrew,那么解压缩附件,把corkscrew.exe和cygwin1.dll拷贝到mysgit的bin目录中。附:corkscrew.zip

第三步,测试

ssh -T git@github.com
Hi username! You've successfully authenticated, but GitHub does not provide shell access.

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: 在公司的局域网使用git或github 设置代理 – https://www.chenyudong.com/archives/use-git-or-github-in-company-local-net.html

分类: Programming

ssh非交互式密码授权(三):使用密钥进行认证

说明:本文中的密码如无特殊说明,均指的是口令

在前面的两个方法中,我们登录都是需要使用密码来进行认证,今天介绍一种ssh无需输入密码的登录方式,免去了记忆、保存密码(口令)的不便。当有密码的时候,会存在着一些严重的问题:

  • 你需要去记住一个密码,而且为了安全,你的密码必须很长并且最好是随机的,但是这个记忆(保存)需要成本
  • 如果远程主机被攻陷,对方修改ssh程序,可以截获你的密码
  • 多人(多处)使用同一个帐号,存在修改密码,需要周知到很多人(修改代码中的密码)

但是如果使用ssh的密钥(公钥、私钥)认证,那么以上都不是问题。

使用ssh-keygen生成密钥对

要使用这种认证方式,我们需要先生成密钥对。一个私钥,这个放在我们的客户端机器上;公钥,这个可以放在我们想登录的服务器上。

本文以openSSH来说明,目前大部分的Linux/unix都在使用这个程序。 默认情况下,openSSH的ssh-keygen使用的SSH2协议,并且生成RSA密钥对。

user@ubuntu:~/.ssh$ ssh-keygen -C " this is comment "
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa):
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:
ff:9e:ef:ad:4f:c6:e8:92:d0:6d:4e:ab:5d:9a:ad:66  this is comment
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                 |
|                 |
|                 |
|        S  . .   |
|         .. . +o |
|          .. =..=|
|           .o+EO |
|           .=BX++|
+-----------------+

使用ssh-keygen这个程序,就可以生成ssh的公钥和私钥了。参数-C代表注释,可以没有这个参数。

第3行是询问将生成的密钥对存放在哪里,直接回车存放在默认的位置就可以了。

第4行、第5行是让你输入口令短语,这个用于加密私钥的。如果你输入了,会使用它对私钥加密,这意味着你以后每次使用私钥,都要输入这个口令,用来解密私钥。无特殊要求下,这里留空。

查看一下id_rsa

user@ubuntu:~/.ssh$ cat id_rsa
-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEAnDA2NChF2G5oIc8DjSajFoAeDeUazmdCMiSVHR+SuGYr3Nqn
1QdD7JIZjvXePN0oaFhR/9rfKztcHJA93+SGnLieGIcUDnvKnfScLYTYoR53wyRO
howVNtf10l/hFb7SWBv14zvXZNSBy53tvv7dJM871RmZXFVnAMIirDkMz1C9qjXf
b30eBjsXwIl8eHTZdhy75J0q+hFehCHvyO1ZrX8WNsWnQDMlIndDg+XAC7U8+tZR
swtCyVZ5YqH1WrcWvrQxJRS3Z4NsjuZXgFTT6NQnJqemVjd8At1EZb/Ja4qAp8Fx
zMFfjqUMMmOUOeqRBMsehsiavtNP97sKH4eZHQIDAQABAoIBAQCVpN+aE2fwGMAu
fFBTwcwJ99BT0clgLrDOqBwyHhkOEd4+qUSaJ27dz5ErVsiKGf7oEo7mC4c8vY/g
UhbmV+bda0kWCP2fbt3PfxjPx/NiU3W9gyC1aqu8syd0W6allgGkp41sHN6fXbfK
JdMu5rNs3BzgbLlyLOUWZeqghbyPN7ZLOGv53U/Lg4Ru8F/P9EGx9R1tKsPDy+D4
+tmAS/lahl0MuPdnA65yPI7EXQVx2f7Z34OWc5mE1AS2JfUqIWPZUN/a4uqFIMHR
FTfuzRFVKJ0IcOUsaWECkmvwAgzi2DdiZJqEOqdhgoJZc53BInt03O1Ofla2pEKj
KCidn/8lAoGBAM70qglt6Rz2FhueKy/ngPhjFK2O4xf2NLEjhXoIatTcO0Als/xp
+WPCKx+B5LkFSq3nvvqFilKlKlYJE1FXV35Vlxe35cf+6mmsWwLlBzS7IQ0Cnw8V
EdwDCCV1x7ybjMtRXZhfhVgN70YstGKY5GYAyBgBAftYoHdC3ossECgfAoGBAMEz
p1OUyje3WIO4xTMveZcqUOs8E9rEKgX2oTx8UNJHW2Dt9jVGrn+3VFoMjEyUWgtK
IzgWKGwLUAnA7mqsdAZ+zwDb/2Mpv9U19LBPmNmx7Phzv2jyS5J41SGJaWAQym5G
0eilmkZ1m9ktGuyT28K0Kntu8zlw9T3cEyx4Q8dDAoGAaZRT8r+Jv2aj3K8SZTv7
hbw2XlyY6i6Grx/qBlmo9rLr30vcyJbfzc7O5SIFJ4bVlGa3/WKHMKZmNMIogsTG
NANCM61zolYgDI0LWSyyQmp88AA4WR9snwtE6qdtoIDSkR8PWp7Qjh19xhUkaXCK
hKc9bVGGS03pfy40DlgKXg0CgYEAkb+F22fDpYSLIdOh8Js//unNYahQ0hhqG1WT
DS47SmbKaLUbp9VKjs6es9ADh0HjK+Eh8I3GsLtYBgOl2JOAc+X2A4/zebtlHFM3
5Eon5RJ00nl/TIx8tmKxZjtjYzVHgSmr8PX9DGpsx8lfJlnkz11bLwLkOdEdMS10
yXdwqkECgYEApZtZmAJLMUEuFFmgGzmVRwPW2DnztxOVmen4NYVjGnQ2Bb0ERmGc
a/b+3V9GCewDO8wjdQVvt2p6+Y1wdAlWBNggFejB0I4kHqI6fBuyiglbWYOz1jQD
wrxiAWkW0PvLvzy/hLxcv/HO/4/El2hHB2N5wGTcg/KZgzNoJtMeXJE=
-----END RSA PRIVATE KEY-----

查看公钥内容,注意它是在一行里面的。

user@ubuntu:~/.ssh$ cat id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCcMDY0KEXYbmghzwONJqMWgB4N5RrOZ0IyJJUdH5K4Zivc2qfVB0PskhmO9d483ShoWFH/2t8rO1wckD3f5IacuJ4YhxQOe8qd9JwthNihHnfDJE6GjBU21/XSX+EVvtJYG/XjO9dk1IHLne2+/t0kzzvVGZlcVWcAwiKsOQzPUL2qNd9vfR4GOxfAiXx4dNl2HLvknSr6EV6EIe/I7VmtfxY2xadAMyUid0OD5cALtTz61lGzC0LJVnliofVatxa+tDElFLdng2yO5leAVNPo1Ccmp6ZWN3wC3URlv8lrioCnwXHMwV+OpQwyY5Q56pEEyx6GyJq+00/3uwofh5kd  this is comment

user@ubuntu:~/.ssh$ clip < id_rsa.pub   # 复制到粘贴板

本篇不多说ssh-keygen的相关参数,如果需要,可以访问http://linux.die.net/man/1/ssh-keygen进行查阅。

到远程服务器部署公钥

需要让服务器知道是我们去连接服务器的,那么我就就需要手工的将公钥添加到远程服务器上,这样去连接服务器的时候,通过验证后,就可以连接上服务器了。

可以手工的rz公钥到服务器上,或者scp到服务器上。

对于OpenSSH来说,我们需要将公钥加入到~/.ssh/authorized_keys中。每个公钥一行,千万注意不要换行,否则可能不能正常工作。

user@ubuntu:~/.ssh$ scp id_rsa.pub username@remotehost:~/.ssh/
username@remotehost's password:

## 远程服务器上
username@remotehost:~/.ssh$ cat id_rsa.pub >>  authorized_keys

# 修改一下权限。
username@remotehost:~/.ssh$ chmod 600  authorized_keys

注意一下权限,不要让别人把公钥写入这个文件中。

这样,我们就可以直接ssh、scp访问到远程服务器了,不用再输入密码了。

默认情况下,我们使用ssh去访问远程服务器,默认会去读取一些私钥的文件名,我们可以使用ssh -v localost查看一下连接过程。

user@ubuntu:~/.ssh$ ssh -v localhost
OpenSSH_6.2p2 Ubuntu-6ubuntu0.1, OpenSSL 1.0.1e 11 Feb 2013
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: Applying options for *
debug1: Connecting to localhost [127.0.0.1] port 22.
debug1: Connection established.
debug1: identity file /home/user/.ssh/id_rsa type 1
debug1: Checking blacklist file /usr/share/ssh/blacklist.RSA-2048
debug1: Checking blacklist file /etc/ssh/blacklist.RSA-2048
debug1: identity file /home/user/.ssh/id_rsa-cert type -1
debug1: identity file /home/user/.ssh/id_dsa type -1
debug1: identity file /home/user/.ssh/id_dsa-cert type -1
debug1: identity file /home/user/.ssh/id_ecdsa type -1
debug1: identity file /home/user/.ssh/id_ecdsa-cert type -1
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_6.2p2 Ubuntu-6ubuntu0.1
debug1: Remote protocol version 2.0, remote software version OpenSSH_6.2p2 Ubuntu-6ubuntu0.1
debug1: match: OpenSSH_6.2p2 Ubuntu-6ubuntu0.1 pat OpenSSH*
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr hmac-md5-etm@openssh.com none
debug1: kex: client->server aes128-ctr hmac-md5-etm@openssh.com none
debug1: sending SSH2_MSG_KEX_ECDH_INIT
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
debug1: Server host key: ECDSA ec:71:86:f6:6f:12:cd:8f:fd:5a:69:c3:bb:ef:a2:70
debug1: Host 'localhost' is known and matches the ECDSA host key.
debug1: Found key in /home/user/.ssh/known_hosts:3
debug1: ssh_ecdsa_verify: signature correct
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: Roaming not allowed by server
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey,password
debug1: Next authentication method: publickey
debug1: Offering RSA public key: /home/user/.ssh/id_rsa
debug1: Server accepts key: pkalg ssh-rsa blen 279
debug1: read PEM private key done: type RSA
debug1: Authentication succeeded (publickey).
Authenticated to localhost ([127.0.0.1]:22).
debug1: channel 0: new [client-session]
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.
debug1: Sending environment.
debug1: Sending env LANG = en_US.UTF-8

通过连接过程,我们可以看到ssh会去读取一下默认的文件,和私钥文件。因此私钥的文件名不能随便改名。另外也可以生成多个私钥,但是这个时候就需要添加到文件中了。

多个私钥

我们在使用密钥的时候,肯定不会只使用一个密钥,我们有许多个不同的服务器,帐号不同,用户名不同,我们有多个私钥,因此我们需要管理这些密钥。

通过~/.ssh/config这个文件可以配置特定的主机,使用特定的私钥、用户名。

如果没有这个文件,那么创建它,并添加下面的内容,注意设置一下权限。

user@ubuntu:~/.ssh$ chmod 600 ~/.ssh/config
user@ubuntu:~/.ssh$ cat ~/.ssh/config
Host github.com *.github.com
  ProxyCommand connect -H web-proxy.oa.com:8080 %h %p
  IdentityFile ~/.ssh/privatekey/id_rsa.github
  User git
这里可能会有connect程序没有安装的问题出现`/bin/bash: line 0: exec: connect: not found`。执行`apt-get install connect-proxy`安装

我们配置文件,

  • 第一行Host指定了目标主机。
  • 第二行ProxyCommand说明要使用代理去访问这个主机。
  • 第三行IdentityFile指定私钥的路径,通过这个关键字这样就可以保存多个私钥了。
  • 第四行User指明了用户。

另外,如果你不想写这个配置文件,那么可以在ssh命令中使用-i参数指定私钥的路径。

-i identity_file Selects a file from which the identity (private key) for RSA or DSA authentication is read. The default is ~/.ssh/identity for protocol version 1, and ~/.ssh/id_rsa and ~/.ssh/id_dsa for protocol version 2. Identity files may also be specified on a per-host basis in the configuration file. It is possible to have multiple -i options (and multiple identities specified in configuration files).
ssh -i ~/.ssh/privatekey/id_rsa.github -T git@github.com

以下是连接github.com的一个过程,连接普通的ssh服务器也是差不多的(上面有连接普通的ssh服务器)。可以看到ssh命令会首先读取config的里面的配置。然后会尝试使用我的私钥。

$ ssh -vt git@github.com
OpenSSH_4.6p1, OpenSSL 0.9.8e 23 Feb 2007
debug1: Reading configuration data /c/Users/user/.ssh/config
debug1: Applying options for github.com
debug1: Executing proxy command: exec connect -H web-proxy.oa.com:8080 github.co
m 22
debug1: permanently_drop_suid: 500
debug1: identity file /c/Users/user/.ssh/privatekey/id_rsa.github type -1
debug1: Remote protocol version 2.0, remote software version OpenSSH_5.9p1 Debia
n-5ubuntu1+github5
debug1: match: OpenSSH_5.9p1 Debian-5ubuntu1+github5 pat OpenSSH*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_4.6
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-cbc hmac-md5 none
debug1: kex: client->server aes128-cbc hmac-md5 none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
debug1: SSH2_MSG_KEX_DH_GEX_INIT sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY
debug1: Host 'github.com' is known and matches the RSA host key.
debug1: Found key in /c/Users/user/.ssh/known_hosts:3
debug1: ssh_rsa_verify: signature correct
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey
debug1: Next authentication method: publickey
debug1: Trying private key: /c/Users/user/.ssh/privatekey/id_rsa.github
debug1: read PEM private key done: type RSA
debug1: Authentication succeeded (publickey).
debug1: channel 0: new [client-session]
debug1: Entering interactive session.
debug1: Remote: Forced command.
debug1: Remote: Port forwarding disabled.
debug1: Remote: X11 forwarding disabled.
debug1: Remote: Agent forwarding disabled.
debug1: Remote: Pty allocation disabled.
debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
Hi username! You've successfully authenticated, but GitHub does not provide shell access.
debug1: channel 0: free: client-session, nchannels 1
Connection to github.com closed.
debug1: Transferred: stdin 0, stdout 0, stderr 34 bytes in 0.7 seconds
debug1: Bytes per second: stdin 0.0, stdout 0.0, stderr 47.6
debug1: Exit status 1

如果你有多台的服务器,那么就需要将公钥复制到那么多的远程服务器上,这个会比较麻烦些了,但是免去输入密码的步骤,在开发非交互程序,那可是省下了很多的步骤了。

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: ssh非交互式密码授权(三):使用密钥进行认证 – https://www.chenyudong.com/archives/ssh-using-private-public-key-no-password.html

分类: Programming

ssh非交互式密码授权(二):sshpass让ssh支持password参数

上一篇说到利用expect来访问远程ssh服务器,并输入命令,但是expect有一些不足,而且有些麻烦。使用sshpass这个程序,支持密码作为参数使用,这样方便很多。

我在使用expect的时候,等待的时候比较长,下面介绍一个响应速度快的程序,那就是sshpass。

安装sshpass

这个程序需要自己编译安装,步骤很简单。

从网站上下载代码,http://sourceforge.net/projects/sshpass/

tar -zxvf sshpass-1.05.tar.gz
cd sshpass-1.05
./configure 
make && make install

这个程序很快就安装完了。

命令参数

接下来我们看看如何使用sshpass。

[root@www ~/sshpass-1.05]# sshpass
Usage: sshpass [-f|-d|-p|-e] [-hV] command parameters
   -f filename   Take password to use from file
   -d number     Use number as file descriptor for getting password
   -p password   Provide password as argument (security unwise)
   -e            Password is passed as env-var &quot;SSHPASS&quot;
   With no parameters - password will be taken from stdin

   -h            Show help (this screen)
   -V            Print version information
At most one of -f, -d, -p or -e should be used

结合ssh一起使用

sshpass -p "mypassword" ssh -p 22 user@127.0.0.1 &quot;ls&quot;

这样,通过sshpass参数-p指定密码,在ssh命令的等待输入密码的时候就能自动将密码写入到输入流中了。

解决著名的第一次问题

在ssh第一次去访问机器的时候,ssh会提示你是否需要将目标ip写入到系统的已知主机中。因为这个的输出会干扰sshpass判断何时应该输入密码。下面程序分析会说。

ssh user@127.0.0.1
The authenticity of host '127.0.0.1 (127.0.0.1)' can't be established.
RSA key fingerprint is c4:4e:a1:56:ad:32:a0:b5:90:13:4e:b8:a2:cf:24:a0.
Are you sure you want to continue connecting (yes/no)? 

通过制定参数-o StrictHostKeyChecking=no让ssh自动添加到已知主机文件中。

ssh -o StrictHostKeyChecking=no user@127.0.0.1
Warning: Permanently added '127.0.0.1' (RSA) to the list of known hosts.
user@127.0.0.1's password: 

sshpass底层源码分析

底层的工作原理和expect差不多,都是去等待输出,

int handleoutput( int fd )
{   
    // We are looking for the string
    static int prevmatch=0; // If the &quot;password&quot; prompt is repeated, we have the wrong password.
    static int state1, state2;
    static const char compare1[]=&quot;assword:&quot;; // Asking for a password
    static const char compare2[]=&quot;The authenticity of host &quot;; // Asks to authenticate host
    // static const char compare3[]=&quot;WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!&quot;; // Warns about man in the middle     attack
    // The remote identification changed error is sent to stderr, not the tty, so we do not handle it.
    // This is not a problem, as ssh exists immediately in such a case
    char buffer[40];
    int ret=0;
    
    int numread=read(fd, buffer, sizeof(buffer) );

    state1=match( compare1, buffer, numread, state1 );

    // Are we at a password prompt? 
    if( compare1[state1]=='\0' ) {
    if( !prevmatch ) {
        write_pass( fd );
        state1=0;
        prevmatch=1;
    } else {                                                                                                             
        // Wrong password - terminate with proper error code
        ret=RETURN_INCORRECT_PASSWORD;
    }   
    }
.....
}

优缺点

先说一下不足吧。

1.我使用的Linux是公司修改过的,账户使用LDAP帐号登录(其实我至今还不懂LDAP是什么,但是都这么叫),输入ssh命名后和普通的ssh的不一样。

####  公司的ssh输出
ssh  -p 22 user@10.168.123.145 
Keyboard-interactive:
PAM authentication
Password: 
Keyboard-interactive:
PAM authentication
LDAP Password: 

#### 普通的ssh命令输出
ssh user@localhost
user@localhost's password: 

所以现在在公司里面没办法使用sshpass,但是在没有修改过的Linux系统上是可以使用sshpass的。这个问题我得找个懂C语言的大神问问。

初步分析好像是公司的Linux经过安全设置,阻止了获取子进程的tty终端,导致无法获取子进程的输出。

2.就是密码放在参数里使用,有些不安全,别人可以使用history来查看到历史的命令,虽然指定了参数可以从文件中获取,但是这个文件里面也是需要进行权限控制的。

优点就是简单,速度会比使用expect快很多。

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: ssh非交互式密码授权(二):sshpass让ssh支持password参数 – https://www.chenyudong.com/archives/sshpass-ssh-password-parameter-non-interactive-ssh.html

分类: Programming

ssh非交互式密码授权(一):expect自动输入密码、命令

本文有还有2篇类似的文章:

Linux ssh下执行ssh命令远程登录其他机器,总是需要输入密码,如果人工去登录,输入密码那还可以,但是让程序自动化登录远程ssh服务器,并执行命令着就比较麻烦了。

Linux下有个程序是expect,它可以模拟键盘,输入文本。

安装expect

机器上一般是没有这个命令的,需要安装expect

sudo apt-get install expect
yum install expect

经常看到一些脚本有会expect、spawn、send关键字,这几个关键字都是在expect程序里面使用的。

使用expect脚本运行

#!/usr/bin/expect

set timeout 5

password=ppp

spawn ssh user@localhost -p 22
expect {
    "(yes/no)" { send "yes\r"; exp_continue }
    "password:" { send "$password\r" }
}
expect user@*   {send \" ls -l \r\" }  ;
expect user@*  { send exit\r } ;
expect 100% ;
expect eof ;
  • 注意第一行使用的是#!/usr/bin/expect而不是普通的bash脚本那样
  • expect都是使用{},且{、}使用时,前后需要留空格
  • 例子使用花括号,表示使用一组并列表达式,只要其中一项符合,就会执行该项,类似switch

使用命令行参数运行expect

有时候写个expect脚本比较麻烦,直接只用命令行参数去执行命令,或者嵌套在shell脚本、python脚本中,这样可以减少expect脚本的数量

一下是一个登录并执行一个ls命令的demo:

 expect -c "
            set timeout 1;
            spawn ssh user@localhost -p 22  ;
            expect {
                yes/no { send \"yes\r\"; exp_continue }
                *assword* { send \"password\r\" }
            } ;
            expect user@*   {send \" ls -l \r\" }  ;
            expect user@*  { send exit\r } ;
            expect eof ;
        "

expect的参数-c后面是字符串,里面就相当于脚本里面的内容了。

  • ;分号隔开,可以在同一行里。
  • 里面的"引号,使用\"来代替。
  • 第9行的exit最好要有。退出ssh,这样程序不会阻塞。我如果没有使用,在这个shell命令执行完,无法立刻输入字符。
  • expect脚本必须以interact或expect eof结束,执行自动化任务通常expect eof就够了

expect与scp使用

expect一般用于登录ssh服务器,除了ssh命令输入密码外,还有scp也是需要密码输入的,因此expect与scp结合起来使用的场景也是很多的。

expect -c "
           set timeout 1;
           spawn scp -P 22 user@remoteHost:/tmp/file.txt ~/  ;
           expect {
               yes/no { send \"yes\r\"; exp_continue }
               *assword* { send \"password\r\" }
           } ;
           expect user@*   {send \" ls -l \r\" }  ;
           expect user@*  { send exit\r } ;
           expect 100% ;
           expect eof ;
       "

注意:scp的制定端口使用大写的-P

python中使用expect命令

SCP_CMD_BASE = r"""
            expect -c "
            set timeout 1;
            spawn scp -P {port} {username}@{host}:/tmp/{{filename}} ./proxydownload/  ;
            expect *assword* {{{{ send {password}\r }}}}  ;
            expect *\r
            expect \r
            expect eof
            "
    """.format(username=username,password=password,host=host,port=port)

cmd = SCP_CMD_BASE.format(filename = filename)
print "cmd=", cmd
p  = subprocess.Popen( cmd , stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
(output, err) = p.communicate()

其他的相关知识

Python对expect也有类库支持,也就是说你可以直接使用python编写expect,而不用安装expect程序了。可以执行搜索一下python pexpect

用expect速度会比较慢,因为需要等待返回的数据,然后输入命令执行。没有ssh密钥登录的快速。

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: ssh非交互式密码授权(一):expect自动输入密码、命令 – https://www.chenyudong.com/archives/expect-non-interactive-ssh-login-password-authentication.html

分类: Programming

较早的文章

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

SITEMAP回到顶部 ↑