redis安装流程

安装:

1、安装依赖包

yum -y install gcc gcc-c++ libstdc++-devel tcl

2、获取安装文件并解压文件

tar -zvx -f redis-3.2.4.tar.gz

3、进入目录

cd redis-3.2.4

4、编译

make

5、安装

make install

6、设置配置文件路径

mkdir -p /etc/redis 
cp redis.conf /etc/redis

7、修改配置文件

vi /etc/redis/redis.conf 

仅修改: daemonize yes

8、启动

/usr/local/bin/redis-server /etc/redis/redis.conf

9、查看启动

ps -ef | grep redis

10、使用客户端

redis-cli

set name hello 
OK 
get name 
“hello”

测试:

127.0.0.1:6379> hset 10001 name zhangsan 
(integer) 1 
127.0.0.1:6379> keys * 
1) “10001” 
127.0.0.1:637 
127.0.0.1:6379> hset 10001 address shanghai 
(integer) 1 
127.0.0.1:6379> HGETALL 10001 
1) “name” 
2) “zhangsan” 
3) “address” 
4) “shanghai”

node1:6379> select 1 
node1:6379[1]> flushall 
OK 
node1:6379[1]> keys * 
(empty list or set)

Linux终端前缀变成-bash-4.2#解决办法

这个问题困扰了我很久,每次登陆终端提示就是这样子:

Last login: Fri Jan 19 15:57:15 2018 from 
Welcome to JCLOUD Elastic Compute Service
-bash-4.2#

后来以为是软件环境问题,找到了个解决办法:

终端输入:PS1="[root@localhost ~]"

之后看起来是解决了这个问题,但是一直是这样子的提示,进出目录该有的提示都没有,就是个摆设。

后来找到了正确的解决方法。

这个问题出现的原因是.bashrc文件被破坏,导致里面没有该有的内容
那是什么内容呢?就是这个:

PS1='[u@h W]$ '

因为我把rm改造为mv之后,没有加上这个代码,导致读取不到,所以就显示bash-4.2,把这个代码加入.bashrc之后,source .bashrc即可恢复。

上代码示例:

PS1='[u@h W]$ '>>.bashrc
source .bashrc

这样就解决了这个问题,希望对出现此问题的有帮助。

解释下shell下的bash中的test记忆

解决问题

  • test有几种写法
  • [ -f 1.txt ] 为什么在[]前后必须有空格

写法

if [ -f 1.txt ];then echo "hello";fi

if [ -f 1.txt ];then
    echo "hello"
fi

if [ -f 1.txt ];
then
    echo "hello"
fi

if [ -f 1.txt ]
then echo "hello"
fi

if [ -f 1.txt]
then
    echo "hello"
fi

总结

  • [ -f 1.txt ] ‘[‘是命令名 ’-f 1.txt ]’是参数,参数是用空格分割的,这是一个命令
  • if then后都是跟的命令
  • ;和回车都可以分割命令,多个命令在一行要用;分割

Bash Shell 逐行读取文件

1. 问题

先看有问题的代码:

#!/bin/bash
cat file.txt | while read eachline ; do
        echo $eachline
done

上例中,while代码块的输入流已经被管道符重定向至cat的输出,

所以如果在while代码块内,有sed、awk、ssh 等命令时,会在第一次循环时,一次性读取输入流内容的所有行。

这样read命令在第二次运行时,输入流的内容已经是空的,read就读取不到内容,从而结束循环。

2. 解决方法

为了避免上面的问题,可以参考这样的处理方式:

假如,/etc/hosts的内容有

192.168.12.6   host_a
192.168.12.9  host_b
192.168.12.18  host_c
192.168.12.19  host_d

用这段代码处理:

cat /etc/hosts | grep host | while read v1 v2
do
exec 8<& 0 0< /dev/null
ssh $v2 "hostname"
exec 0<& 8 8<& -
done

运行以上代码后,输出结果为:

host_a
host_b
host_c
host_d

3. 原理

FD=文件标示符(File Descriptor)

exec 8<& 0 0< /dev/null 这句会将FD=8的输入重定向到FD=0所使用的输入设备,然后将FD=0的输入重定向到/dev/null。

这样,ssh就不会影响到read在下一次要读取的内容。

exec 0<& 8 8<& - 这句会将FD=0的输入重定向到FD=8所使用的输入设备(也就是cat的输出内容),然后关闭FD=8的输入,使其他程序可以使用FD=8。

Ubuntu16.04解决无法切换root权限的问题

在su root时发现无法切换到root权限.显示: /usr/local/bin/zsh 没有文件或目录

想了想问题所在,突然想起来前段时间想要更换shell主题,于是装了zsh和oh-my-zsh,用了一段时间感觉没有bash好用(纯粹个人感觉),于是sudo apt remove zsh了.

当时将默认的shell改成了zsh:

chsh -s /bin/zsh

那么chsh到底修改了哪里呢? chsh -s 其实修改的是你的/etc/passwd文件里和你用户名相对应的一行,我们可以查看一下:

shanlei@shanlei-Lenovo-ideapad-110-15ISK:~$  cat /etc/passwd|grep ^shanlei
shanlei:x:1000:1000:shanlei,,,:/home/shanlei:/bin/zsh
shanlei@shanlei-Lenovo-ideapad-110-15ISK:~$

进入passwd:

sudo vim /etc/passwd

我们可以看到 :

root:x:0:0:root:/root:/usr/local/bin/zsh
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-timesync:x:100:102:systemd Time Synchronization,,,:/run/systemd:/bin/false
systemd-network:x:101:103:systemd Network Management,,,:/run/systemd/netif:/bin/false
systemd-resolve:x:102:104:systemd Resolver,,,:/run/systemd/resolve:/bin/false
systemd-bus-proxy:x:103:105:systemd Bus Proxy,,,:/run/systemd:/bin/false
syslog:x:104:108::/home/syslog:/bin/false
_apt:x:105:65534::/nonexistent:/bin/false
messagebus:x:106:110::/var/run/dbus:/bin/false
uuidd:x:107:111::/run/uuidd:/bin/false
lightdm:x:108:114:Light Display Manager:/var/lib/lightdm:/bin/false
whoopsie:x:109:116::/nonexistent:/bin/false
avahi-autoipd:x:110:119:Avahi autoip daemon,,,:/var/lib/avahi-autoipd:/bin/false
avahi:x:111:120:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/bin/false
dnsmasq:x:112:65534:dnsmasq,,,:/var/lib/misc:/bin/false
colord:x:113:123:colord colour management daemon,,,:/var/lib/colord:/bin/false
speech-dispatcher:x:114:29:Speech Dispatcher,,,:/var/run/speech-dispatcher:/bin/false
hplip:x:115:7:HPLIP system user,,,:/var/run/hplip:/bin/false
kernoops:x:116:65534:Kernel Oops Tracking Daemon,,,:/:/bin/false
pulse:x:117:124:PulseAudio daemon,,,:/var/run/pulse:/bin/false
rtkit:x:118:126:RealtimeKit,,,:/proc:/bin/false
saned:x:119:127::/var/lib/saned:/bin/false
usbmux:x:120:46:usbmux daemon,,,:/var/lib/usbmux:/bin/false
shanlei:x:1000:1000:shanlei,,,:/home/shanlei:/bin/zsh

因为我想要的是默认的bash,所以我修改了passwd文件的第一行和最后一行:

第一行的/usr/local/bin/bash改成/usr/local/bin/zsh,这个是root用户的:

root:x:0:0:root:/root:/usr/local/bin/bash

把最后一行的/bin/bash改成/bin/zsh,这个应该是每台电脑的登录用户名+计算机名组成的:

shanlei:x:1000:1000:shanlei,,,:/home/shanlei:/bin/bash

保存退出,重启shell,切换root权限,发现/usr/local/bin/bash 没有文件或目录

检查bash安装位置:

shanlei@shanlei-Lenovo-ideapad-110-15ISK:~$ whereis bash
bash: /bin/bash /etc/bash.bashrc /usr/share/man/man1/bash.1.gz
shanlei@shanlei-Lenovo-ideapad-110-15ISK:~$ 

发现bash的执行文件在/bin/bash,于是重新修改/etc/passwd文件的第一行:

root:x:0:0:root:/root:/bin/bash

然后把默认的shell改为bash:

chsh -s /bin/bash

再次切换:

shanlei@shanlei-Lenovo-ideapad-110-15ISK:~$ su -
密码: 
root@shanlei-Lenovo-ideapad-110-15ISK:~# 

成功~

————————————————————————-美丽的分割线—————————————————————————-

修改ubuntu默认shell的另外两种方式:

  • ln -s : 强制把/bin/sh的软链接改到bash中: sudo ln -s /bin/bash /bin/sh
  • dpkg-reconfigure dash:在Ubuntu中建议使用这个方法:sudo dpkg-reconfigure dash,弹出来个选择项,把“dash设为默认shell”选择no。
    怎样查看自己的机器上装了哪些shell?
shanlei@shanlei-Lenovo-ideapad-110-15ISK:~$ cat /etc/shells
# /etc/shells: valid login shells
/bin/sh
/bin/dash
/bin/bash
/bin/rbash
shanlei@shanlei-Lenovo-ideapad-110-15ISK:~$ 

怎样查看自己当前使用的shell是哪个?(注意SHELL一定要是大写!)

shanlei@shanlei-Lenovo-ideapad-110-15ISK:~$ echo $SHELL
/bin/bash
shanlei@shanlei-Lenovo-ideapad-110-15ISK:~$ 

执行了zsh之后,我查看当前shell类型仍然是/bin/bash呢?

当前的shell是一个大环境,是针对一个已登录用户而言的,而我们使用的bash或zsh只是启动了一个bash或zsh解释器程序而已,并没有改变大环境,如果想要改变改变大环境,必须使用chsh

通过ssh会话执行bash别名

SSH 客户端 (ssh) 是一个登录远程服务器并在远程系统上执行 shell 命令的 Linux/Unix 命令。它被设计用来在两个非信任的机器上通过不安全的网络(比如互联网)提供安全的加密通讯。

未分类

我在远程主机上上设置过一个叫做 file_repl 的 bash 别名 。当我使用 ssh 命令登录远程主机后,可以很正常的使用这个别名。然而这个 bash 别名却无法通过 ssh 来运行,像这样:

$ ssh [email protected] file_repl
bash:file_repl:command not found

我要怎样做才能通过 ssh 命令运行 bash 别名呢?

SSH 客户端 (ssh) 是一个登录远程服务器并在远程系统上执行 shell 命令的 Linux/Unix 命令。它被设计用来在两个非信任的机器上通过不安全的网络(比如互联网)提供安全的加密通讯。

如何用 ssh 客户端执行命令

通过 ssh 运行 free 命令或 date 命令 可以这样做:

$ ssh [email protected] date

结果为:

Tue Dec 26 09:02:50 UTC 2017

或者:

$ ssh [email protected] free -h

结果为:

 total used free shared buff/cache available
Mem:2.0G 428M 138M 145M 1.4G 1.1G
Swap:0B 0B 0B

理解 bash shell 以及命令的类型

bash shell 共有下面几类命令:

  • 别名,比如 ll
  • 关键字,比如 if
  • 函数 (用户自定义函数,比如 genpasswd)
  • 内置命令,比如 pwd
  • 外部文件,比如 /bin/date

type 命令 和 command 命令 可以用来查看命令类型:

$ type -a date
date is /bin/date
$ type -a free
free is /usr/bin/free
$ command -V pwd
pwd is a shell builtin
$ type -a file_repl
is aliased to `sudo -i /shared/takes/master.replication'

date 和 free 都是外部命令,而 file_repl 是 sudo -i /shared/takes/master.replication 的别名。你不能直接执行像 file_repl 这样的别名:

$ ssh user@remote file_repl

在 Unix 系统上无法直接通过 ssh 客户端执行 bash 别名
要解决这个问题可以用下面方法运行 ssh 命令:

$ ssh -t user@remote /bin/bash -ic 'your-alias-here'
$ ssh -t user@remote /bin/bash -ic 'file_repl'

ssh 命令选项:

  • -t:强制分配伪终端。可以用来在远程机器上执行任意的 基于屏幕的程序,有时这非常有用。当使用 -t 时你可能会收到一个类似 “bash: cannot set terminal process group (-1): Inappropriate ioctl for device. bash: no job control in this shell .” 的错误。

bash shell 的选项:

  • -i:运行交互 shell,这样 shell 才能运行 bash 别名。
  • -c:要执行的命令取之于第一个非选项参数的命令字符串。若在命令字符串后面还有其他参数,这些参数会作为位置参数传递给命令,参数从 $0 开始。

总之,要运行一个名叫 ll 的 bash 别名,可以运行下面命令:

$ ssh -t [email protected] -ic 'll'

结果为:

未分类

Running bash aliases over ssh based session when using Unix or Linux ssh cli

下面是我的一个 shell 脚本的例子:

#!/bin/bash
I="tags.deleted.410"
O="/tmp/https.www.cyberciti.biz.410.url.conf"
box="[email protected]"
[!-f "$I" ] && { echo "$I file not found。"; exit 10; }
>$O
cat "$I" | sort | uniq | while read -r u
do
    uu="${u##https://www.cyberciti.biz}"
    echo "~^$uu 1;" >>"${O}"
done
echo "Config file created at ${O} and now updating remote nginx config file"
scp "${O}" ${box}:/tmp/
ssh ${box} /usr/bin/lxc file push /tmp/https.www.cyberciti.biz.410.url.conf nginx-container/etc/nginx/
ssh -t ${box} /bin/bash -ic 'push_config_job'

相关资料

更多信息请输入下面命令查看 OpenSSH 客户端 和 bash 的 man 帮助 :

$ man ssh
$ man bash
$ help type
$ help command 

git找回工作区删除的文件

一不小心删除了一个文件怎么办?如果不小心删除一个文件,应该看到这样的提示:

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        deleted:    app/Theme.php

此时直接git checkcout是不行的,应该先git reset HEAD app/Theme.php。注意看提示其实已经说了。
测试你再一次git status:

On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   app/Http/Controllers/Controller.php
        deleted:    app/Theme.php
        modified:   readme.md
        modified:   resources/views/show_partials/item_themes.blade.php
        modified:   resources/views/wlddy/show.blade.php
        modified:   resources/views/wlddy/wlddyform.blade.php
        modified:   resources/views/wlj/wljform.blade.php

修改已经到了not staged的分组了。这个时候,你再git checkout Apptheme.php就可以了!

Git 清理历史提交文件缓存

在刚开始使用 git 的过程中,由于对 git 的工作方式不甚了解,总会产生一些很傻很天真的操作。比如,为了方便项目读取,将二进制文件和代码一起提交到了 git 仓库;亦或者一不小心,将本地打出来的部署包一同提交到了 git 仓库,导致整个项目庞大无比,别人在克隆项目时苦不堪言。虽然可以重建项目,但是又不想丢弃提交记录,该怎么解决呢?

其实我们可以通过 git 命令,来清除文件缓存,而不清除提交记录。

比如,当初为了方便部署,将应用部署包放入 files 文件夹一同提交到了 git 仓库,现在虽然已经删除部署包后重新提交,但是部署包依然后存在于提交记录(以便回退)。我们可以按以下步骤清除指定文件缓存。

步骤 1:整理需要删除缓存的包及路径

整理出包相对于项目的路径。比如,整理出路径如下:

roles/tomcat/files/apache-tomcat-7.0.52.tgz
roles/GraphicsMagickDeployment/files/ImageServer.tar.gz
roles/GraphicsMagickDeployment/files/probe.tar.gz
roles/java/files/jdk1.7.0_51.tgz
roles/tomcat-yuminstall/files/apache-tomcat-7.0.52.tgz
roles/redis/files/redis-2.8.13.tgz
roles/zookeeper/files/zookeeper-3.4.6.tar.gz

步骤 2:执行命令清除缓存

清除命令如下:

git filter-branch --index-filter 
'git rm --cached --ignore-unmatch 
roles/tomcat/files/apache-tomcat-7.0.52.tgz 
roles/GraphicsMagickDeployment/files/ImageServer.tar.gz 
roles/GraphicsMagickDeployment/files/probe.tar.gz 
roles/java/files/jdk1.7.0_51.tgz 
roles/tomcat-yuminstall/files/apache-tomcat-7.0.52.tgz 
roles/redis/files/redis-2.8.13.tgz 
roles/zookeeper/files/zookeeper-3.4.6.tar.gz' 
-f -- --all

执行后, git 会遍历所有的提交,删除相关记录及文件(只删除提交记录中的文件记录,并不会删除整个提交),所以过程需要等待。

需要注意的是,清除后的文件无法通过提交记录还原。

步骤 3:删除原有项目并重建

需在 git 仓库上删除原有项目并重新提交,才可顺利进行,否则会出新冲突。

步骤 4:删除本地项目后重新克隆

若不删除本地项目,重新拉会导致冲突,所以执行操作前,最好先通知本地人员提交当前版本,并等待操作完成。

Git只拉取部分代码

在某些情况下,我们会有从git上拉取部分文件的需求。

下面脚本就演示了如何从gitlab中只拉取需要的文件:

#!/bin/bash
# 拼接git地址,并加上权限
GITLAB_PROTOCOL=https://
GITLAB_USER=xxx
GITLAB_PASSWD=xxx
GITLAB_ADDRESS=git.xxx.com
GITLAB_GOURP=xxxxxx
PROJECT_NAME=xxxxxx
CLONE_ADDRESS=$GITLAB_PROTOCOL$GITLAB_USER':'$GITLAB_PASSWD'@'$GITLAB_ADDRESS'/'$GITLAB_GOURP'/'$PROJECT_NAME'.git'

# 初始化
git init 
# 添加源
git remote add origin $CLONE_ADDRESS
# 配置sparsecheckout为true
git config core.sparsecheckout true
# 把要拉取的文件目录加入到.git/info/sparse-checkout文件中
echo "dockerfile*" >> .git/info/sparse-checkout
echo "*.sh" >> .git/info/sparse-checkout
# 拉取文件
git pull origin master

pull完成之后所有dockerfile和脚本文件就会被下载到本地。

Git 忽略提交 .gitignore

在使用Git的过程中,我们喜欢有的文件比如日志,临时文件,编译的中间文件等不要提交到代码仓库,这时就要设置相应的忽略规则,来忽略这些文件的提交。

Git 忽略文件提交的方法

有三种方法可以实现忽略Git中不想提交的文件。

在Git项目中定义 .gitignore 文件

这种方式通过在项目的某个文件夹下定义 .gitignore 文件,在该文件中定义相应的忽略规则,来管理当前文件夹下的文件的Git提交行为。

.gitignore 文件是可以提交到共有仓库中,这就为该项目下的所有开发者都共享一套定义好的忽略规则。

在 .gitingore 文件中,遵循相应的语法,在每一行指定一个忽略规则。如:

*.log
*.temp
/vendor

在Git项目的设置中指定排除文件

这种方式只是临时指定该项目的行为,需要编辑当前项目下的 .git/info/exclude 文件,然后将需要忽略提交的文件写入其中。

需要注意的是,这种方式指定的忽略文件的根目录是项目根目录。

定义Git全局的 .gitignore 文件

除了可以在项目中定义 .gitignore 文件外,还可以设置全局的 git .gitignore 文件来管理所有Git项目的行为。这种方式在不同的项目开发者之间是不共享的,是属于项目之上Git应用级别的行为。

这种方式也需要创建相应的 .gitignore 文件,可以放在任意位置。然后在使用以下命令配置Git:

git config --global core.excludesfile ~/.gitignore

Git 忽略规则

详细的忽略规则可以参考官方英文文档: https://git-scm.com/docs/gitignore

Git 忽略规则优先级

在 .gitingore 文件中,每一行指定一个忽略规则,Git 检查忽略规则的时候有多个来源,它的优先级如下(由高到低):

  • 从命令行中读取可用的忽略规则
  • 当前目录定义的规则
  • 父级目录定义的规则,依次地推
  • $GIT_DIR/info/exclude 文件中定义的规则
  • core.excludesfile中定义的全局规则

Git 忽略规则匹配语法

在 .gitignore 文件中,每一行的忽略规则的语法如下:

  • 空格不匹配任意文件,可作为分隔符,可用反斜杠转义
  • # 开头的文件标识注释,可以使用反斜杠进行转义
  • ! 开头的模式标识否定,该文件将会再次被包含,如果排除了该文件的父级目录,则使用 ! 也不会再次被包含。可以使用反斜杠进行转义
  • / 结束的模式只匹配文件夹以及在该文件夹路径下的内容,但是不匹配该文件
  • / 开始的模式匹配项目跟目录
  • 如果一个模式不包含斜杠,则它匹配相对于当前 .gitignore 文件路径的内容,如果该模式不在 .gitignore 文件中,则相对于项目根目录
  • ** 匹配多级目录,可在开始,中间,结束
  • ? 通用匹配单个字符
  • [] 通用匹配单个字符列表

常用匹配示例

  • bin/: 忽略当前路径下的bin文件夹,该文件夹下的所有内容都会被忽略,不忽略 bin 文件
  • /bin: 忽略根目录下的bin文件
  • /*.c: 忽略 cat.c,不忽略 build/cat.c
  • debug/*.obj: 忽略 debug/io.obj,不忽略 debug/common/io.obj 和 tools/debug/io.obj
  • **/foo: 忽略/foo, a/foo, a/b/foo等
  • a/**/b: 忽略a/b, a/x/b, a/x/y/b等
  • !/bin/run.sh: 不忽略 bin 目录下的 run.sh 文件
  • *.log: 忽略所有 .log 文件
  • config.php: 忽略当前路径的 config.php 文件

.gitignore规则不生效

.gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。

解决方法就是先把本地缓存删除(改变成未track状态),然后再提交:

git rm -r --cached .
git add .
git commit -m 'update .gitignore'