catalog

  1. . Linux弱口令攻击向量
  2. . Linux登录验证步骤
  3. . PAM
  4. . 弱口令风险基线检查

1. Linux弱口令攻击向量

0x1: SSH密码暴力破解

  1. hydra -l root -P /root/passwdCracker/password.lst -t -vV -e ns 112.124.51.10 ssh

对于Linux系统来说,从外部破解系统密码的途径只有SSH这一条路,攻击者必须借助网络进行密码猜解尝试

0x2: Linux SSH空口令帐号

  1. . 通过Bash指令: cut -d: -f1 /etc/passwd,获取当前账户列表
  2. . 遍历列表,调用getpwnamgetgrgid获取每个账户的pw_namepw_shell,过滤出是shell为/bin/bash或/bin/sh(非/sbin/nologin)的账户
  3. . 将过滤出的帐号在/etc/shadow中逐行查找,判断当前帐号是否为空口令(第二段为空)

但是需要注意的是,用户账号刚创建时没有口令,但是被系统锁定,无法使用,必须为其指定口令后才可以使用,即使是指定空口令

0x2: /etc/shadow本地暴力破解(john and ripper)

  1. tar zxvf john-.ll
  2. cd john-1.8./src
  3. make
  4. make clean generic
  5. cd ../run
  6. ./unshadow /etc/passwd /etc/shadow > mypasswd
  7. ./john ./mypasswd

Relevant Link:

  1. http://www.openwall.com/john/
  2. http://www.openwall.com/john/doc/EXAMPLES.shtml
  3. http://www.douban.com/note/326215912/
  4. http://darren.blog.51cto.com/1081720/634241
  5. http://linuxconfig.org/password-cracking-with-john-the-ripper-on-linux
  6. http://4506912.blog.51cto.com/4496912/999577
  7. http://www.kafan.cn/edu/42559051.html

2. Linux登录验证步骤

  1. . 根据用户名从/etc/passwd提取uidgid以及家目录和shell配置
  2. . /etc/shadow根据uid核对密码
  3. . 进入shell控制阶段
  4. //此时并不意味着登录成功,若用户对应的shell为/sbin/nologin,则禁止该用户登录系统,但可以进行其他工作,譬如操作邮件,注: /etc/nologin.txt可以显示用户不能登录的原因
  5. . 进行PAM验证,读取/etc/pam.d/login,必须通过验证才能最终登录,该文件内容通常如下
  6. auth required pam_securetty.so
  7. //pam_securetty.so读取/etc/securrety,设定root用户可以登陆的终端,一般只设置tty而没有pts/0,telnet使用该模块故无法使用root用户登录,而sshd没有使用到该模块故不受限制
  8.  
  9. auth required pam_stack.so service=system-auth
  10. auth required pam_nologin.so
  11. //pam_nologin.so 模块始终允许root用户可以登陆,其他用户只有在/etc/nologin文件不存在时可以登陆, 若/etc/nologin文件存在,则在输入正确用户名及任意密码后将该文件内容显示给用户
  12.  
  13. account required pam_stack.so service=system-auth
  14. password required pam_stack.so service=system-auth
  15. session required pam_stack.so service=system-auth
  16. session optional pam_console.so
  1. +----------------+
  2. | application: X |
  3. +----------------+ / +----------+ +================+
  4. | authentication-[---->--\--] Linux- |--<--| PAM config file|
  5. | + [----<--/--] PAM | |================|
  6. |[conversation()][--+ \ | | | X auth .. a.so |
  7. +----------------+ | / +-n--n-----+ | X auth .. b.so |
  8. | | | __| | | _____/
  9. | service user | A | | |____,-----'
  10. | | | V A
  11. +----------------+ +------|-----|---------+ -----+------+
  12. +---u-----u----+ | | |
  13. | auth.... |--[ a ]--[ b ]--[ c ]
  14. +--------------+
  15. | acct.... |--[ b ]--[ d ]
  16. +--------------+
  17. | password |--[ b ]--[ c ]
  18. +--------------+
  19. | session |--[ e ]--[ c ]
  20. +--------------+

0x1: 密码验证模块验证流程

  1. . 执行/usr/bin/passwd,并输入密码
  2. . passwd调用PAM模块,读取/etc/pam.d/passwd配置文件并加载相应.so文件,对输入的密码进行验证
  3. . 将验证结果传回passwd程序
  4. //注: passwd修改密码时,除了参考/etc/login.defs,还要满足/etc/pam.d/passwd模块的验证

Relevant Link:

  1. http://blog.itpub.net/15480802/viewspace-1406088

3. PAM

PAM的英文全称是Pluggable Authentication Module系统,即此程序是有关执行用户鉴别和帐号维护的服务。鉴别部分通常通过: (合法性)质询-回应的交互来完成的。使用PAM,管理员可以通过不重编辑鉴定程序来定制一些使用方法,PAM有四部分组成

  1. . libpam: 实现PAM API的库
  2. . PAM配置文件: /etc/pam.conf
  3. . 一套动态可装载二进制对象组成,常常用来调用一些处理实际鉴别(authentication)工作的服务模块
  4. . 使用PAM API的系统命令组成,如loginusftptelnetetc..

0x1: LIBPAM

PAM API的认证(authentication)常规程序有三个主要函数组成

  1. . pam_start( const char *service_name, const char *username, const struct pam_conv *conv, pam_handle_t **pamh_p );
  2. /*
  3. pam_start()和pam_end()函数是开始和结束一个PAM会话,传递给pam_start()
  4. 函数的参数如下所示:
  5. + service_name: 一定义在pam.conf中的特殊服务
  6. + username: 需要鉴权的用户登录名。
  7. + conv: 一指向pam_conf结构的指针
  8. + pamh_p: 一双精度指向pam_handle_t结构的指针。PAM构架会分配或不分配内存给这个结构,并且一应用程序不能直接访问它。它基本上是用来通过PAM构架(framework)来处理多个并发的PAM会话
  9.  
  10. pam_conv结构如下所示:
  11. struct pam_conv {
  12. int (*conv)(int num_msg, const struct pam_message **msg,
  13. struct pam_response **resp, void *appdata_ptr);
  14. void *appdata_ptr;
  15. }
  16.  
  17. *conv是指向PAM对话函数的指针,appdata_ptr指针指向特殊应用程序数据,它并不常用
  18. */
  19.  
  20. . pam_end( pam_handle_t *pamh, int exit_status );
  21. /*
  22. pam_end()函数的参数由在pam_start()函数中填充的pam_handle_t*组成,并且返回的是exit状态。exit状态正常情况下是PAM_SUCCESS。pam_edn()会收回与pam_handle_t*相关联的内存,并且任何企图重用这个句柄将返回一个seg fault错误
  23. */
  24.  
  25. . pam_authenticate( pam_handle_t *pamh, int flags );
  26. /*
  27. pam_authenticate()函数也再一次由通过pam_start()填充的pam_handle_t*组成,并且可选的标志(flags)可以传递给结构(framework)
  28. */

另外一些可以应用于应用程序的PAM API函数如下所示

  1. + pam_set_item() - PAM会话写状态信息
  2. + pam_get_item() - PAM获得状态信息
  3. + pam_acct_mgmt() - 检查当前用户帐号是否合法
  4. + pam_open_session() - 开始一个新的会话
  5. + pam_close_session() - 关闭当前会话进程
  6. + pam_setcred() -管理用户信任资格(credentials)
  7. + pam_chauthtok() - 改变用户的鉴权(authentication)token
  8. + pam_strerror() - 返回错误字符串,类似与perror()函数

0x2: PAM.CONF

PAM配置文件通常位于/etc/pam.conf,它可以分为四个部分

  1. . 鉴权(authentication)
  2. . 帐号管理
  3. . 会话管理
  4. . 密码管理

一个标准的一行配置如下所示:

  1. login auth required /usr/lib/security/pam_unix.so. try_first_pass
  2. ) 第一栏是服务名,这是参照在pam_start()函数中的第一个参数。如果通过pam_start()的服务请求不列在pam.conf,则将使用默认的"other"服务。"other"服务名字可以是"su""rlogin",如果服务名不止一次说明,模块将会提示"stacked",并且framework将会通过第三栏的值来决定
  3. ) 第二栏指示这特定的服务将执行何种类型的行为,合法的值是: "auth"为鉴权行为、"account"为帐号管理、"session"为会话管理、"password"为密码管理。不是所有的应用程序需要使用每一个行为,如,su仅仅需要使用"auth"鉴权行为,"passwd"只需要来使用"password"管理行为
  4. ) 第三栏作为一个控制类型的一栏。如果用户在鉴定行为中失败,它指示PAM 架构(framework)行为。此栏正确的值为:"requisite","required", "sufficient", "optional":
  5. 3.1) + "requisite"意思指如果用户在鉴定(quthentication)时失败,PAM framework会立即返回一失败信息,其中没有其他模块调用。
  6. 3.2) + "required"指示如果一个用户鉴定(quthentication)时失败,PAM framework只在调用其他所有模块后在返回失败信息。这样做的话用户会不知道哪个模块鉴权被拒绝,如果一个用户成功被鉴别,所有"required"模块必须返回成功
  7. 3.3) + "optional"意思是用户将被允许访问即使鉴权失败,失败的结果是下一个在堆栈中的模块将被处理
  8. 3.4) + "sufficient"指的是如果用户传递一这特定模块,PAM framework会立即返回成功,即使随后的模块有"requisite"或者"required"控制值,类似于"optional"
  9. "sufficient"回允许访问即使鉴全步骤失败
  10. ) pam.conf第四栏中是认证模块的路径,各个系统路径不同,如在Linux-PAM系统中PAM模块在/usr/lib目录下,而Solaris在/usr/lib/security中维护模块
  11. ) 第五栏是一个空格分开的module-dependent选项列表,是传递给认证模块调用

0x3: 模块 MODULES

每一个PAM模块本质上是一个必须输出特定函数的库,这些函数可以被PAM framework调用(面向接口编程),通过库输出的函数有如下列表

  1. + pam_sm_authenticate()
  2. + pam_sm_setcred()
  3. + pam_sm_acct_mgmt()
  4. + pam_sm_open_session()
  5. + pam_sm_close_session()
  6. + pam_sm_chauthtok()

如果实现者不决定在一模块内支持特定的操作,模块会为此操作返回PAM_SUCCESS,例如:如果一个模块设计成为不支持帐号管理(account management),pam_sm_acct_mgmt()函数会简单的返回PAM_SUCCESS
pam_sm_authenticate()是按下面的方式声明的

  1. extern int pam_sm_authenticate( pam_handle_t *pamh, int flags, int argc, char **argv);
  2. 上面的指针是指想一个PAM句柄--已经通过framework填充了,flags是应用程序调用pam_authenticate()传递给framework的一组标志,argcargv是在pam.conf中此服务的选项参数的数字和值

一个简单的pam_unix 模块中的pam_sm_authenticate()函数应该如下所示

  1. #include <security/pam_modules.h>
  2. #include <...>
  3.  
  4. extern int
  5. pam_sm_authenticate( pam_handle_t *pamh, int flgs, int c, char **v )
  6. {
  7. char *user;
  8. char *passwd;
  9. struct passwd *pwd;
  10. int ret;
  11.  
  12. /* ignore flags and optional arguments */
  13.  
  14. if ( (ret = pam_get_user( ..., &user )) != PAM_SUCCESS )
  15. return ret;
  16. if ( (ret = pam_get_pass( ..., &passwd )) != PAM_SUCCESS )
  17. return ret;
  18. if ( (pwd = getpwnam(user)) != NULL ) {
  19. if ( !strcmp(pwd->pw_passwd, crypt(passwd)) )
  20. return PAM_SUCCESS;
  21. else
  22. return PAM_AUTH_ERR;
  23. }
  24.  
  25. return PAM_AUTH_ERR;
  26. }

0x4: 应用程序 APPLICATION

一个应用程序处理PAM部分必须由pam_start()和pam_end()组成和一PAM对话函数。比较幸运的是,user-space PAM API定义的比较成熟和稳定所以对话函数是比较模板型的代码。一个简单的su PAM实现所下所示

  1. #include <security/pam_appl.h>
  2. #include <...>
  3.  
  4. int su_conv(int, const struct pam_message **,
  5. struct pam_response **, void *);
  6.  
  7. static struct pam_conv pam_conv = { su_conv, NULL };
  8.  
  9. int
  10. main( int argc, char **argv )
  11. {
  12. pam_handle_t *pamh;
  13. int ret;
  14. struct passwd *pwd;
  15.  
  16. /* assume arguments are correct and argv[1] is the username */
  17.  
  18. ret = pam_start("su", argv[], &pam_conv, &pamh);
  19. if ( ret == PAM_SUCCESS )
  20. ret = pam_authenticate(pamh, );
  21. if ( ret == PAM_SUCCESS )
  22. ret = pam_acct_mgmt(pamh, );
  23.  
  24. if ( ret == PAM_SUCCESS ) {
  25. if ( (pwd = getpwnam(argv[])) != NULL )
  26. setuid(pwd->pw_uid);
  27. else {
  28. pam_end(pamh, PAM_AUTH_ERR);
  29. exit();
  30. }
  31. }
  32. pam_end(pamh, PAM_SUCCESS);
  33.  
  34. /* return 0 on success, !0 on failure */
  35. return ( ret == PAM_SUCCESS ? : );
  36. }
  37.  
  38. int
  39. su_conv(int num_msg, const struct pam_message **msg,
  40. struct pam_response **resp, void *appdata)
  41. {
  42. struct pam_message *m = *msg;
  43. struct pam_message *r = *resp;
  44.  
  45. while ( num_msg-- )
  46. {
  47. switch(m->msg_style) {
  48.  
  49. case PAM_PROMPT_ECHO_ON:
  50. fprintf(stdout, "%s", m->msg);
  51. r->resp = (char *)malloc(PAM_MAX_RESP_SIZE);
  52. fgets(r->resp, PAM_MAX_RESP_SIZE-, stdin);
  53. m++; r++;
  54. break;
  55.  
  56. case PAM_PROMPT_ECHO_OFF:
  57. r->resp = getpass(m->msg);
  58. m++; r++;
  59. break;
  60.  
  61. case PAM_ERROR_MSG:
  62. fprintf(stderr, "%s\n", m->msg);
  63. m++; r++;
  64. break;
  65.  
  66. case PAM_TEXT_MSG:
  67. fprintf(stdout, "%s\n", m->msg);
  68. m++; r++;
  69. break;
  70.  
  71. default:
  72. break;
  73. }
  74. }
  75. return PAM_SUCCESS;
  76. }

Relevant Link:

  1. http://www.xfocus.net/articles/200006/45.html
  2. http://www.helplib.net/s/linux.die/65_1666/man-3-pam-start.shtml

3. 弱口令风险基线检查

0x1: 检测方案

  1. . 通过Bash指令: cut -d: -f1 /etc/passwd,获取当前账户列表
  2. . 遍历列表,调用getpwnamgetgrgid获取每个账户的pw_namepw_shell,过滤出是shell为非"/sbin/nologin"的账户
  3. . 将上一步得到的账号在/etc/shadow中查找,过滤出password hash不为空的帐号(即只有显式通过passwd指令设置过密码的账号才可以登录)
  4. . 遍历过滤出的"可登录帐号",调用pam_authenticate API/或者SSH login API进行登录尝试
  5. . 记录并上报猜解出的弱口令

0x2: 基于PAM API框架进行密码猜解尝试

对于Linux弱口令风险来说,空口令风险不存在(帐号创建默认空口令但是被系统锁定)、john and ripper本地破解/etc/shadow(密码学原理)无法防御,因为不可能禁止用户读取这个文件,禁止读取会造成破坏正常业务的风险

  1. #include <stdlib.h>
  2. #include <iostream>
  3. #include <fstream>
  4. #include <security/pam_appl.h>
  5. #include <unistd.h>
  6. #include <string.h>
  7.  
  8. // To build this:
  9. // g++ test.cpp -lpam -o test
  10.  
  11. struct pam_response *reply;
  12.  
  13. //function used to get user input
  14. int function_conversation(int num_msg, const struct pam_message **msg, struct pam_response **resp, void *appdata_ptr)
  15. {
  16. *resp = reply;
  17. return PAM_SUCCESS;
  18. }
  19.  
  20. int main(int argc, char** argv)
  21. {
  22. if(argc != )
  23. {
  24. fprintf(stderr, "Usage: check_user <username>\n");
  25. exit();
  26. }
  27. const char *username;
  28. username = argv[];
  29.  
  30. const struct pam_conv local_conversation = { function_conversation, NULL };
  31. pam_handle_t *local_auth_handle = NULL; // this gets set by pam_start
  32.  
  33. int retval;
  34.  
  35. // local_auth_handle gets set based on the service
  36. retval = pam_start("login", username, &local_conversation, &local_auth_handle);
  37. //retval = pam_start("common-auth", username, &local_conversation, &local_auth_handle);
  38.  
  39. if (retval != PAM_SUCCESS)
  40. {
  41. std::cout << "pam_start returned " << retval << std::endl;
  42. exit(retval);
  43. }
  44.  
  45. reply = (struct pam_response *)malloc(sizeof(struct pam_response));
  46.  
  47. // *** Get the password by any method, or maybe it was passed into this function.
  48. //reply[0].resp = getpass("Password: ");
  49. reply[].resp = strdup("test");
  50. reply[].resp_retcode = ;
  51.  
  52. retval = pam_authenticate(local_auth_handle, | PAM_DISALLOW_NULL_AUTHTOK);
  53.  
  54. if (retval != PAM_SUCCESS)
  55. {
  56. if (retval == PAM_AUTH_ERR)
  57. {
  58. std::cout << "Authentication failure." << std::endl;
  59. }
  60. else
  61. {
  62. std::cout << "pam_authenticate returned " << retval << std::endl;
  63. }
  64. exit(retval);
  65. }
  66.  
  67. std::cout << "Authenticated." << std::endl;
  68.  
  69. retval = pam_end(local_auth_handle, retval);
  70.  
  71. if (retval != PAM_SUCCESS)
  72. {
  73. std::cout << "pam_end returned " << retval << std::endl;
  74. exit(retval);
  75. }
  76.  
  77. return retval;
  78. }

pam位于SSH的底层(更下一层),调用pam_authenticate api不受/sbin/nologin的影响,从本质上来说和ssh登录尝试是一样的,在代码中要注意的是,调用pam_start时传入"login"服务器名即可,因为仅仅需要使用"auth"鉴权行为

  1. pam_start中的参数service_name服务名指定了使用哪个配置文件,如service_name"login",将使用/etc/pam.d/login这个配置

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAXIAAAAoCAIAAABsJOZ7AAAFXUlEQVR4nO2d3ZWkIBCFjYuAOGeyIYSJopIhmN4HRQrqltpKu2vv/c4+7NCA/F4LhXL6/f39+fmZyEqU10xO+3FeOYUby0a+q+VTXiojcSfwExf6IJQVQshgKCuEkMFQVgghg6GsEEIGQ1khhAzmHlkpD6Jveg5NCPmb3CArIeVZT9b/9D8U6tvDRoLUK99gI9fAEgLzNIpmrv4JnBqdyujN5FFu0/ERl4qSU0j5Wi7vtxL5CINlBQ2MlMvM3xs2UZaYoaaZ6uyPsu4liVLGsRlJ8BpXx+tZYI1OcC71fbW+LAhzBhdzaVrpYpEu1+ifu9CdtLIy31xzivOqpVQ3rLtp2m7rAptbc009N1tos3SNiGmZgqiwUWz4KVnBV1f2T8plOxyse42Z5PV6iYiqdcpms5ap0Zzr0eHU1bEWSXK2fVQDU15LpstTrT8RSWHy+l1XHTRTTV7nxvJbTk3yenVngA2RFd1KzlBERUJN5yR3ropqdG3KPB5rrUQp1V5utVFeytyoRoIN9KwVifO8Mr86EoDvzH3q0A/NzTz3AlUt1JRH1exiVvWROE0pv3IK1UpxavSWrLSZqT+rzYYDUwY2XS19WAo7remafp+mGNeIwHjUyUvfhKSEZhWjVlXthepkvzC5ulYCQ9EpEmy6t4yI4VPm8SBZabun/XtpBBg4bcqKxCOy4i0W5jEMKnBhEaQD26KVTFE1Q5dslRWJNU+V8ODyRwlNWyXbpFHADESBKmUx9PxB3Pd7c28vE8JLHlKezbTSR6GTika/QHtEySkga/QgUETaELdIsD3fk5XBU+bx3CQrzroD9DwaWFG2Tuh0mZy0VqJ8RFbcBZ2tosS6htArFl+UYOYq8JKs6Duqro4nK13n+uU2vwxYCYCrITne0ffOnKGsnGZfVtonGqUNYKDumGpQbtytjSLUmOtP1ZLXRdK3mnZqnV8ENStzv5qN/awWQUhWYI2m44sgIBzKlmla2wYiWWmLpNpxaxGhF0s4+Ry56Qv3rYxjrRSTdg/QdDvyunYnLBJuOjiSPYZPmcfTyEprJmoz/mDghN4G64cSzqOqrB4ctnet3nLdeCR2JM+NwMYWzupeslV3EclJPaksz3qXV67uffigrKB5AN9Zg0D19LS1FHWVbAhq0JxVaW3yUtveIrWFci406ZXyHrbpPAEDGxP8dup7CCb3SmNqdHHKPB5uh4McNUw/asEeXUB9AylL3F2kQP6nVnoM3LzfQ38rhFyEskIIGQxlhRAyGMoKIWQwlBVCyGAoK4SQwVBWCCGDcbbDnXlv+kEHH3oj+ee50VMJId+ItVZCyiIHNib5x3/O84ndZafy/MZzGoTchZWV5XSHPvaynqhYN4n5rlWsgw/r5GLe4p5zG9PJ0/HMArx+aGOrj9Xmgf1urJElUlYIOU8vK6E7KzdNzok1x1oxDj5cJxfIvZtvWZhDicjrB/IPctTvhlpncRFEyCU6WalzUOnKO7LSx/ScXKjsd/I0ObvR8FGuY343sL8VQsgJOlnpzmOWwPOy4jm5GC8r0D8IjIyKRFkhZBj9myDkiGddUmj3X45rFStAeIq6suL4ntjwzLJ4/XD8gxz1u4H9rSy/cFFEyBtoWdHeC5rPZfQeoXsnH40XE+vgw3i0KMsQ66LD+p7AvlGQ1w/HP8hRvxudv5XefyJlhZCjcDscIWQwlBVCyGAoK4SQwVBWCCGDoayQx/BC/8g/CGWFPAbKylOgrJDHQFl5CvygB3kMlJWncIOs6M+PNcJivKg4X4LCn2eK5qg0POvsHIC+yYeL+22rExm9mfzGA5MjLhUlpz0fFpSVh/AHdbtkyNzMODIAAAAASUVORK5CYII=" alt="" />

在centos、ubuntu下测试都通过

Relevant Link:

  1. http://stackoverflow.com/questions/5913865/pam-authentication-for-a-legacy-application/5970078#5970078
  2. http://stackoverflow.com/questions/5913865/pam-authentication-for-a-legacy-application
  3. http://www.jiancool.com/article/58701980019/;jsessionid=798A5A41EB356A6A1FC5C8E449523F6B

Copyright (c) 2015 LittleHann All rights reserved

Linux System Account SSH Weak Password Detection Automatic By System API的更多相关文章

  1. Linux学习笔记--SSH免password登录

    须要实现的效果: 有两台server:"192.168.201.236" 和 "192.168.201.237" 须要实现:在server"192.1 ...

  2. Linux 批量建立信任关系,实现ssh无password登陆的脚本

    作用: 把当前机器的ssh公钥拷贝到其它机器.以实现从当前机器能够ssh无password登陆到其它机器 用法: 1)把要加入的ip地址写入到一个文件里.比方host 2)把脚本保存为sh文件,如 i ...

  3. linux中解决SSH连接慢问题 关键点GSSAPIAuthentication

    [root@ok 6FE5-D831]# ssh -v xxx.xxx.xxx.64 OpenSSH_5.3p1, OpenSSL Feb debug1: Reading configuration ...

  4. linux下开启SSH,并且允许root用户远程登录,允许无密码登录

    参考:http://blog.csdn.net/jia0511/article/details/8237698 1. 允许root用户远程登录 修改ssh服务配置文件 sudo vi /etc/ssh ...

  5. 正式生产环境下hadoop集群的DNS+NFS+ssh免password登陆配置

    博客地址:http://www.loveweir.com/ 环境虚拟机centos6.5 主机名h1  IP 192.168.137.11  作为DNS FNS的server 主机名h2  IP 19 ...

  6. linux远程登录ssh免密码

    原文链接,感谢原作者. (一)问题: 假如我们现在有两台机器:ServerA和ServerB,现在想要让ServerA不用输入密码就能够进行访问. (二)方法和原理: 我们使用ssh-keygen在S ...

  7. Linux远程登录ssh免密码配置方法(仅供参考)

    这篇文章主要介绍了linux远程登录ssh免密码配置方法,需要的朋友可以参考下(http://www.0834-3659999.com) 一.情景 公司刚上几台Linux,现在要把主机之间都能远程ss ...

  8. linux 下的ssh免密登陆设置

    一,原理 说明: A为linux服务器a B为linux服务器b 每台linux都有ssh的服务端和客户端,linux下的ssh命令就是一个客户端 我们常用ssh协议来进行登陆或者是文件的拷贝,都需要 ...

  9. Learning Experience of Big Data: Deploying Tomcat 8.0 and connect ssh without password

    This mission seems to be easier--we can just decompression Tomcat to our virtural machine and deploy ...

随机推荐

  1. 用微信小程序做H5游戏尝试

    微信小程序发布后,公司虽然没有拿到第一批内测资格,但作为微信亲密合作伙伴,一定要第一时间去尝试啦.现在微信小程序刚发布还在测试阶段,可以说是1.0版本,所以框架和结构内容都还不多,相关的文档跟微信AP ...

  2. JDK动态代理和CGLib动态代理简单演示

    JDK1.3之后,Java提供了动态代理的技术,允许开发者在运行期间创建接口的代理实例. 一.首先我们进行JDK动态代理的演示. 现在我们有一个简单的业务接口Saying,如下: package te ...

  3. mybatis 3.2.8 + log4j2.0.2 控制台输出sql语句

    mybatis3.2.7有一个bug,使用log4j2 (2.0.2)版本时,会找不到类 ,导致启动失败,详见 https://github.com/mybatis/mybatis-3/issues/ ...

  4. React Native开发技术周报1

    (一).资讯 1.React Native 0.21版本发布,最新版本功能特点,修复的Bug可以看一下已翻译 重要:如果升级 Android 项目到这个版本一定要读! 我们简化了 Android 应用 ...

  5. JavaScript系列:计算一个结果为30的加法智力题

    用下面这段JavaScript代码可以计算出来 function findTheThreeNum(numFix) { var a = ["1", "3", &q ...

  6. Java 密码扩展无限制权限策略文件

    因为某些国家的进口管制限制,Java发布的运行环境包中的加解密有一定的限制.比如默认不允许256位密钥的AES加解密,解决方法就是修改策略文件.   官方网站提供了JCE无限制权限策略文件的下载:   ...

  7. RSA签名验签学习笔记

    RSA私钥签名时要基于某个HASH算法,比如MD5或者SHA1等.之前我一直认为签名的过程是:先对明文做HASH计算,然后用私钥直接对HASH值加密.最近才发现不是那么简单,需要对HASH后的数据进行 ...

  8. lecture2-NN结构的主要类型的概述和感知机

    Hinton课程第二课 一.NN结构的主要类型的概述 这里的结构就是连接在一起的神经元.目前来说,在实际应用中最常见的NN就是前向NN,他是将数据传递给输入单元,通过隐藏层最后到输出层的单元:一个更有 ...

  9. lecture8-RNN的训练方法之二三

    HInton第8课,之所以说之二三,是因为训练RNN的四种方法之一:长短时记忆在lecture7中介绍过了,这里介绍的是第二和第三种方法:HF优化和Echo (这个字觉得翻译成回声是不是欠妥,所以保留 ...

  10. UWP 快速的Master/Detail实现

    最近在写快报(还没有写完)的过程中,一开始就遇到了这个Master/Detail如何实现的问题. 微软给出Demo并不符合要求,搜索后找到了今日头条开发者写的一篇 :实现Master/Detail布局 ...