Linux双向SSH免密登录

原理

双向,顾名思义,双方互通,此处的意思是多台 linux 两两免密登录。双向比单向多了些操作,单向只需把某一个linux的公钥发送给其他linux即可,而双向要实现集群中的每一台机器都保存其他所有机器的公钥。

步骤

假设,你有两台机器,ip分别为A和B:

总共分为三步:

  1. 生成公钥
  2. 将A机器的公钥拷贝至B机器
  3. 将B机器的公钥拷贝至A机器

1、生成公钥

如下命令生成公钥,默认会在~/.ssh/下生成id_rsa和id_rsa.pub。先检查一下机器是否已有公钥,如果没有再执行:

ssh-keygen -t rsa
  • -t 指定算法
  • -f 指定生成秘钥路径
  • -N 指定密码

2、拷贝公钥

cd ~/.ssh
scp id_rsa.pub root@B:/root/.ssh/authorized_keys #此命令在A机器执行,目的将公钥发送至B机器
scp id_rsa.pub root@A:/root/.ssh/authorized_keys #此命令在B机器执行,目的将公钥发送至B机器

scp: 加密的方式在本地主机和远程主机之间复制文件

参数:

  • 源文件:指定要复制的源文件。也可以是远程地址
  • 目标文件:目标文件。格式为user@host:filename(文件名为目标文件的名称)。

3、验证

ssh B #在A机器上,看是否免密登陆B
ssh A #在A机器上,看是否免密登陆B

如果发现设置免密登陆,还需要输入密码,那么检查一下/root.sshauthorized_keys目录和文件的权限。

chmod 600 authorized_keys 
chmod 700 .ssh

如果authorized_keys文件、$HOME/.ssh目录 或 $HOME目录让本用户之外的用户有写权限,那么sshd都会拒绝使用 ~/.ssh/authorized_keys 文件中的key来进行认证的。

Samba集成Ldap认证

1. 基础安装

yum -y install samba-common samba samba-client smbldap-tools  openldap-clients  nss-pam-ldapd

2. 配置authconfig-tui

执行命令 “authconfig-tui”

未分类

未分类

未分类

验证配置

# getent passwd
zhangsan:x:6460:18650:zhangsan:/home/zhangsan:/bin/bash  #此账户为LDAP用户

3. 配置Samba

/etc/samba/smb.conf

[global]
        # 设定 Samba Server 所要加入的工作组或者域。
        workgroup = SAMBA
        # 设置用户访问Samba Server的验证方式,一共有四种验证方式,
        security = user
        cups options = raw

        log level = 3
        syslog = 0
        log file = /var/log/samba/log.%m
        max log size = 100000

        # LDAP 支持
        passdb backend = ldapsam:ldap://172.16.50.117/
        ldap suffix = "dc=morepay,dc=cn"
        ldap admin dn = "cn=Manager,dc=xx,dc=cn"
        ldap user suffix = "ou=People,dc=xx,dc=cn"
        ldap group suffix = "ou=Group,dc=xx,dc=cn"
        ldap delete dn = no
        ldap passwd sync = yes
        ldap ssl = no


[homes]
        comment = Home Directories
        preexec = /data/bin/samba %U
        path = /data/smb/home/%U
        writeable = yes

[caiwu]
        # 共享描述
        comment = caiwu
        # 共享资源路径
        path = /data/smb/caiwu
        # 指定该共享路径是否可写
        writeable = yes
        # 是否有浏览权限
        browseable = yes
        # 指定允许访问该资源的用户,多个用户用','号间隔,(用户组用@+组名)
        valid users = zhangsan
        # 指定不允许访问该共享资源的用户,同 valid users
        # invalid users = 
        # 指定可以在该共享下写入文件的用户
        # write list  =

执行:smbpasswd -W 输入LDAP密码

创建 /data/bin/samba 文件 添加:

umask 077
user=$1
if [ ! -d /data/smb/home/$user ];then
mkdir /data/smb/home/$user
chmod 777 /data/smb/home/$user
fi
chmod 777 /data/bin/samba
mkdir /data/smb/home -p
mkdir /data/smb/caiwu
chmod 777 /data/smb -R

启动samba服务

systemctl restart smb

4. 测试

未分类

测试创建文件及目录

未分类

未分类

ubuntu samba配置

1、设置root密码和更换vim

sudo passwd root
su root

apt-get remove vim-common
apt-get install vim

2、安装samba

apt-get install samba
service smb start

3、备份并修改配置

cp /etc/samba/smb.conf /etc/samba/smb.conf.bak
vim /etc/samba/smb.conf 

4、在文件后追加配置内容

[helb]
comment = Share Folder require password
browseable = yes
path = /home/helb
create mask = 0777
directory mask = 0777
valid users = helb
force user = helb
force group = helb
public = yes
writable = yes
available = yes

5、重启samba

/etc/init.d/samba restart

6、创建共享目录(可跳过)

mkdir /home/share
chmod 777 /home/share

7、建立用

sudo groupadd share -g 6000
sudo useradd share -g 6000 -s /shin/nologin -d /dev/null
smbpasswd -a share

8、windows共享

运行栏:\IP

apt-get install openssh-server

添加用户:

useradd -r -m -s /bin/bash <name>
passwd <name>

Openwrt 之 Samba配置

一、添加编译配置

make menuconfig

Network --->
  <*> samba36-server .......Samba 3.6 SMB/CIFS server

Luci --->
  3. Applications --->(若需要web页面控制则选上)
       <*> luci-app-samba ......Network Shares -samba

二、添加共享配置

先读取/etc/config/samba,结合/etc/samba/smb.conf.template文件,生成配置文件/etc/samba/smb.conf

1、修改模板

vim /etc/samba/smb.conf.template

unix charset = utf-8
#invalid users = root

2、配置共享目录

vim /etc/config/samba

config sambashare
        option name 'share'   //共享文件夹share需要用户名和密码访问
        option path '/mnt'
        option users 'root'     //可useradd 其它用户
        option read_only 'no' 
        option guest_ok 'no'
        option create_mask '0755'
        optin dir_mask '0755'

config sambashare
        option name 'share2'  //共享文件夹share2可游客访问
        option path '/tmp'
        option read_only 'no'
        option guest_ok 'yes'
        option create_mask '0755'
        option dir_mask '0755'

三、设置共享用户密码

smbpasswd -a root
cat /etc/samba/smb.conf

[share]
        path = /mnt
        valid users = root
        read only = no
        guest ok = no
        create mask = 0755

[share2]
        path = /tmp
        read only = no
        guest ok = yes
        create mask = 0755
        directory mask = 0755

若/etc/samba/smbpasswd不存在,则先touch一个。

四、测试

配置好,先重启服务

/etc/init.d/samba restart

PC访问测试

\192.168.1.1

Python读取.wav音频文件

可以使用scipy.io.wavfile.read(somefile)来读取.wav音频文件。它会返回一个元组,第一项为音频的采样率,第二项为音频数据的numpy数组。

用法:

from scipy.io import wavfile
fs, data = wavfile.read('./output/audio.wav')

也可以使用PySoundFile,它也是返回一个元组,指示第一项为数据,第二项为采样率。

用法:

import soundfile as sf
data, samplerate = sf.read('existing_file.wav') 

举例子让你明白python中is和==的区别

在说 is 和 == 的区别之前,我们先理解下python的变量。python的变量和java的变量有很大的区别,因为一个是动态语言,另一个是静态语言。
java的变量就像是个盒子,是把对象的地址装进这个盒子内,就会有大的或者小的盒子。而python的变量像个便利贴,把他贴在哪个地方都可以,不需要管数据类型,只要你喜欢就可以。说太多没有用,得用代码体会下。

a = 1  

上面的代码过程是先在内存中生成了一个int的对象,然后我们把这个便利贴 a 贴在了上面,从此a变量就指向了这个对象。我们还可以看看下面这个。

a = [1, 2]
b = a
b.append(3)
print(a)
# 结果[1, 2, 3]

这里是把a贴在了一个列表上,然后又用b指向a,接着操作b但是却打印了出了b的结果。这是因为a和b都是便利贴,都贴在了同一个列表上,所以操作一个的话,另外一个也会变化。或者我们可以看看这两个变量指向的对象是否是同于一个对象。

print(a is b)
print(id(a), id(b))
# 结果True1461897824584 1461897824584

可以看到,是相等的。

现在我们再看看is和==之间的区别。我们还是先看一个例子。

a = [1, 2, 3]
b = [1, 2, 3]
print(a is b)
print(a == b)

大家可以先猜猜结果是什么。我之前说了python的变量就是个便利贴,[1, 2, 3]都是直接赋值给两个变量,也就是说生成了两个对象,所以a,b指向的对象不一样。所以结果出来了,第一个是False,第二个是True。为什么呢?因为is比较的是对象相同不相同,但是==比较的是值相同不相同。如果打印两个id值的话,显然是不同的。

print(id(a), id(b))
# 结果1735698385160 1735679028936

但是这个呢?

a = 1
b = 1
print(a is b)
print(id(a), id(b))
# 结果True1956929696 1956929696

为什么这个又相等了呢?这是因为python中有个intern机制。

intern机制就是不管你创建了多少个相同的字符串,在python中都是会指向同一个对象的。这是为了防止你不小心创建了多个相同对象而浪费大量内存甚至会发生挤爆内存的后果。有了这个理解,我们再看看下面例子就容易得出答案了。

a = 'str'
b = 's' + 'tr'
print(a is b) # 结果 True
c = "hello world"
d = "hello world"
print(c is d) # 结果 True

再来到==的实际调用,在用==进行判断的时候实际是调用魔法函数eq()来判断他们的值是否相等的。

总的来说,我们在判断是否是同一个对象的时候就用is,不要用==,所以在判断该对象是什么类型的时候建议用is或者直接用isinstance()这个方法。

class Person():
    pass
p = Person()
print(type(p) is Person)  # 结果 True

为什么上面结果是True呢?这是因为我们之前说过类本身也是个对象,用type()方法会指向该对象,又因为这个类,也就是对象是唯一的,所以结果就是True。

完毕!

python 3.x 163邮箱登陆,邮件读取

import  urllib.request
import  urllib.parse
import  http.cookiejar,re

opener = None

# 带Cookie访问
def openurl(parms):
  global opener
  if opener == None:
      #cookie设置
      cj =  http.cookiejar.CookieJar()
      opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
  ret = opener.open(parms)
  return ret

def login_163(**parms):
  #初始化
  parms_key = ['domain','password','username']
  arg = {}
  for key in parms_key:
    if key in parms:
      arg[key] = parms[key]
    else:
      arg[key] = ''
  #获取syscheckcode
  pre_login = arg['domain']
  html = openurl(pre_login).read().decode('utf-8')

  patt = re.compile(r'.*?name=syscheckcode.*?value="(.*?)".*?')
  syscheckcode = patt.search(html)
  if not syscheckcode:
    raise Exception('GET syscheckcode Fail!')
  syscheckcode = syscheckcode.group(1)

  #登陆
  postdata = {
   'syscheckcode':syscheckcode,
   'password':arg['password'],
   'username':arg['username'],
    }
  postdata = urllib.parse.urlencode(postdata)
  postdata = postdata.encode('utf-8')
  req = urllib.request.Request(
    url= arg['domain'],
    data=postdata
    )
  html = openurl(req).read().decode('utf-8')

  thisurl  = 'http://reg.163.com/Main.jsp?username=' + arg['username']
  html = openurl(thisurl).read().decode('utf-8')

  # 获取随机key
  thisurl = 'http://entry.mail.163.com/coremail/fcg/ntesdoor2?verifycookie=1&lightweight=1&from=urs'

  html = openurl(thisurl).read().decode('utf-8')

  patt = re.compile(r'.*[email protected]&sid=(.*?)&from.*?')
  sid = patt.search(html);
  sid = sid.group(1)

  # 获取sid
  thisurl = 'http://mail.163.com/js6/main.jsp?sid=' + sid
  html = openurl(thisurl).read().decode('utf-8')
  thisurl = 'http://mail.163.com/js6/s?sid=' + sid + '&func=mbox:listMessages&topNav_mobileIcon_show=1&TopTabReaderShow=1&TopTabLofterShow=1'

  # 获取邮件key --- 可以读取看看,实际上是一个类似xml的表,所有的邮件都在这里,我们需要的是key,这里是抽取的第一封邮件的key
  html = openurl(thisurl).read().decode('utf-8')
  patt = re.compile(r'.*?name="id">(.*?)</string>.*?')
  key =  patt.search(html);
  key = key.group(1)

  # 获取邮件内容
  thisurl = 'http://mail.163.com/js6/read/readhtml.jsp?mid=' + key
  html = openurl(thisurl).read().decode('utf-8')

  # 测试输出
  print(html)
  # 假设返回假,,这个验证可以最后加上
  flag = True
  #if 'succeedhandle_login' in html:
    #flag = True
  return flag

# 这里是开始,我懒得缩进了 if __name__ == '__main__':
# 用户名 及 密码
while True:
  user = input('input your username:')
  pwd = input('input your password:')
  if len(user) != 0 and len(pwd) != 0:
    break
  print('输入错误')

# 测试网站
dom='https://reg.163.com/logins.jsp'
try:
  flag = login_163(username=user,password=pwd,domain=dom)
  if not flag:
    print('读取失败!')
    exit(0)
  else:
    print('读取成功')
except Exception as e:
   print('Error:',e)

反正大致过程就是上面那样,,,很标准的 post登陆,之后 163 的页面比较特殊,具体可以自己去试试。

那个key页面是抓包之后找到的,通过那个key就能获得每一封邮件了。

整个代码是从一份功能代码中抽出来,因为剩下的内容涉及xxx,所以不发了。

python统计字母、空格、数字等字符个数

# -*- coding: utf-8 -*-
# 要求:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
def count(s):
    count_a=count_z=count_o=count_s=0
    for i in s:
        if (ord(i)>=97 and ord(i)<=122) or (ord(i)>=65 and ord(i)<=90):
            count_a=count_a+1
        elif ord(i)>=48 and ord(i)<=57:
            count_z=count_z+1
        elif ord(i)==32:
            count_s=count_s+1
        else:
            count_o=count_o+1
    print "英文字母个数:%d个"%count_a
    print "数字个数:%d个"%count_z
    print "其他字符个数:%d个"%count_o
    print "空格个数:%d个"%count_s


if __name__=="__main__":
    s=raw_input("请输入一串字符:")
    count(s)

运行结果:

请输入一串字符:{“”O: UIK YTJ ET_+(_^@#%@#$^#%*&456587978957FHSJHSRHFDHDFaHSHYWER YWERF R454qggsdhshrths
英文字母个数:48个
数字个数:15个
其他字符个数:22个
空格个数:7个

总结:

ord()将字符转换为ASCII码