Loading...
Navigation
Table of Contents

Linux常用命令Tech

参考网站:Linux命令大全

Misc

ls -l | grep "^-" | wc -l #统计文件行数
head -100 a.txt #头100行
tail -100 a.txt #尾100行
cat a.txt | grep keyword | cut -f 2 -d ' ' #每一行按照keyword来split
watch -n 1 nvidia-smi #查看显卡占用
sz a.txt #下载文件
rz -bye #打开上传文件窗口
scp -r data username@192.168.1.2:/home/username #scp拷贝文件
tensorboard --port=6066 --logdir=log

ubuntu切换源:参考知乎


ssh

ssh配置免密登录

ssh-keygen -t rsa #在~/.ssh目录下生成id_rsa, id_rsa.pub两个文件
# 方法1,最好用
ssh-copy-id -i ~/.ssh/id_rsa.pub username@IP
# 方法2
scp ~/.ssh/id_rsa.pub username@IP:~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys  # 可选

VPS登录通常有两种方式,一种是传统的用户名+密码的方式登录,一种是利用SSH密钥的方式登录。通过SSH安全密钥方式登录可以避免被不断尝试,其基本原理和认证过程是:

  • 首先用工具生成一对公钥和私钥(存放到本地的某个文件中),然后把公钥放到服务器的/root/.ssh/authorized_keys文件中
  • 使用SSH客户端(比如putty)发送登录请求道服务器,服务器会向用户发送一段随机字符串,SSH客户端用自己的私钥(登录前先指定私钥文件的位置)加密后,再发回给服务器,服务器用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求输入密码。

值得注意的是,实际上远程只需要公钥文件就可以了。此外,如果不想密钥被别人使用,可以加上密码[1]。以下列出几篇参考文献:


  1. 在key passphrase和confirm passphrase的输入框中输入密码,这样在使用SSH KEY登录时会提示输入密钥的密码。这个passphrase和本地远程之间的验证没有关系。 ↩︎

  • 为VPS设置SSH Key并修改SSH端口:介绍了如何在VPS上生成公私密钥,然后下载到本地;如何用私钥生成ppk文件供PuTTY调用
  • SSH原理与运用/etc/ssh/sshd_config这个文件是用来判定是否可以用SSH或者用户名方式登录系统
  • SSH key教程2:提到了\root\.ssh\authorized_keys(和本地的id_rsa.pub一致)放置的是root账户的公钥

密钥更新完后,ubuntu系统使用service ssh restart来重启SSH服务。


git

参见易百教程

初始化

git config --global credential.helper store #记住账号密码
git init #在当前目录初始化git仓库
git clone http://domain.com/abc.git #clone某个仓库到本地,并追踪该分支?

若本地增删改文件,提交到远程。首先使用git add将所有变化提交到暂存区。注意,如果又不想add的文件/目录,应该写在.gitignore文件中,使用回车来分隔。

#.gitignore示例
data
a.ini
/var/www
*.egg

更新

git add -u #提交被修改和被删除文件,不包括新文件(推荐)
git add . #提交新的,被修改的和被删除的文件
不同add方法的区别

然后使用git commit提交到远程

git commit -m '第一次版本提交' #必须写注释
git commit -am '第一次版本提交' #等价于先执行了git add -u 推荐这个

拉取

若想从远程拉取,则使用git pull,其等价于先git fetch然后git merge FETCH_HEAD`。

git pull #“唯一一个追踪分支”和“当前分支”合并
git pull <远程主机名> <远程分支名>:<本地分支名>
git pull origin next #远程origin服务器上next分支与当前分支合并
git pull origin next:master #远程origin服务器上的next分支与本地master分支合并
#使用git库更新单个文件,即放弃未被add的修改
git checkout -- a.txt
#以下是从远程拉取数据,强制覆盖本地
git fetch --all
git reset --hard origin/master

使用git删除文件

git rm a.txt
git rm -r data #删除并做记录
rm data #删除不会做记录, 所以git pull时候又会恢复过来
git rm --cached -r data #删除记录不删除文件

分支

新建并切换git分支

git checkout -b branch1 #新建分支
git push --set-upstream origin branch1 #在远程设置新的分支
git push origin --delete branch1 #删除远程某个分支
git checkout some_branch #切换到某分支

文件

上传/下载

rz -bye #上传文件(不能大于4GB)
sz a.py #下载a.py文件

删除文件

rm a.py #直接删除"文件"
rm -rf test #递归(-r, --recursive)并强制(-f, --force)删除"文件夹"

软/硬链接:ln src_file dst_file

ln /var/a.py /usr/c.py #创建原文件/var/a.py的硬链接文件, 原文件必须是文件
ln -s /var/www abc #在当前目录创建/var/www的软链接(-s)文件abc

查看文件个数/大小/内容

ls -lR|grep "^-"|wc -l #查看文件的个数, 包括子目录里的
ls -lR|grep "^d"|wc -l #查看目录的个数, 包括子目录里的
du -sh #查看当前目录大小
du -sk filename #查看指定文件/目录大小
#其中-h是指以人性化(--human)方式显示大小, -k是指以kB方式显示
cat filename | tail -n +10 | head -n 5 #显示10-15行
cat filename| head -n 20 | tail -n +10 # 显示10-20行

显示文件某几行具体参见这里


压缩

压缩文件

zip -r a.zip /home/user/test
#递归(-r)打包test目录为a.zip文件,压缩包里一级目录有test
zip -r a.zip *
#递归(-r)打包当前目录所有文件为a.zip文件,压缩包里无一级目录
unzip a.zip #解压文件到当前目录
unzip -o -n test.zip -d /tmp #解压文件到(-d)指定的/tmp目录并覆盖同名文件(-o)
unzip -v test.zip #查看(-v)压缩包信息

备份/打包和压缩 利用tar命令,可以把一大堆的文件和目录全部打包成一个文件(注意打包和压缩的区别)。

tar -cvf log.tar 1.log #仅备份all.log,不压缩
tar -cv -f log.tar 1.log #也能写成这样
#-c是建立文件, -v是显示操作过程, -f是指定备份文件/压缩包的名字
tar -zcvf log.tar.gz 1.log #打包后以gzip压缩,后缀名加个gz
tar -jcvf log.tar.bz2 1.log #打包后以bzip2压缩,后缀名加个bz2
tar -zxvf log.tar.gz -C /tmp #利用gzip(-z)来解压(-x)这个gz文件到目录(-C)tmp下

进程

查看进程

ps -e #显示系统中所有进程
ps -x #显示系统中所有后台进程,-e中TTY显示为?的就是后台进程
#-a(其它用户进程),-u(当前用户进程)
ps -aux | grep java #用管道抓取和java相关的进程
lsof -i:8080 #查看占用8080端口的进程

top 任务管理器,按M可按照内存占用排序,按f可自定义显示栏目

  • VIRT. 虚拟内存中含有共享库、共享内存/栈/堆和所有已申请的总内存空间
  • RES. 是进程正在使用的内存空间(栈、堆),申请内存后该内存段已被重新赋值
  • SHR. 是共享内存正在使用的空间
  • SWAP. 交换的是已经申请,但没有使用的空间,包括(栈堆共享内存)

更多参考30个实例详解TOP命令

运行/结束进程

nohup python a.py & #使用nohup和&后台运行进程
kill -s 9 PID #传递信号9, 强制终止进程
#也有其它类型的信号, 如终端, 暂停和继续

bash/zsh

如果是bash,更改~/.bashrc;如果是zsh,更改.zshrc

bashrc的高亮配置

export PS1="\[\033[38;5;27m\]>\[$(tput sgr0)\]\[\033[38;5;15m\] \[$(tput sgr0)\]\[\033[38;5;14m\]\u\[$(tput sgr0)\]\[\033[38;5;15m\] @ \[$(tput sgr0)\]\[\033[38;5;2m\]\h\[$(tput sgr0)\]\[\033[38;5;15m\]: \[$(tput sgr0)\]\[\033[38;5;11m\]\w\[$(tput sgr0)\]\[\033[38;5;15m\]\n\[$(tput sgr0)\]\[\033[38;5;206m\]\\$\[$(tput sgr0)\]\[\033[38;5;15m\] \[$(tput sgr0)\]"
alias mysshfs='sshfs USERNAME@192.168.1.1:/REMOTE_PATH ~/LOCAL_PATH -onoappledouble,auto_cache,reconnect,volname=LOCAL_NAME,defer_permissions,negative_vncache'

无root权限下的zsh安装,参考:

总结下来,安装过程如下,这里下载的6.0版本的ncurses(官网链接):

cd ~
wget https://invisible-mirror.net/archives/ncurses/ncurses-6.0.tar.gz
tar -zxvf ncurses-6.0.tar.gz -C . #解压gz文件到当前目录
export CXXFLAGS=" -fPIC"#先声明一些环境变量
export CFLAGS=" -fPIC"
cd ncurses-6.0
./configure --prefix=$HOME --enable-shared #安装到家目录
make
make install
安装ncurses(可选)

这时候会发现include目录和lib目录在~目录(home目录)下,其中lib目录下还得有libncurses.a等库文件。

cd ~
wget -O zsh.tar.xz https://sourceforge.net/projects/zsh/files/latest/download
xz -d zsh.tar.xz # 会把xz文件解压成tar文件
mkdir zsh
#添加一下环境变量
export PATH=$HOME/bin/:$PATH
export LD_LIBRARY_PATH=$HOME/lib:$LD_LIBRARY_PATH
export CPPFLAGS="-I$HOME/include"
export LDFLAGS="-L$HOME/lib"

tar -xvf zsh.tar -C zsh --strip-components 1 # 解压tar文件到zsh目录
cd zsh
./configure --prefix=$HOME --enable-shared
make
make install
安装zsh

和这时候zsh会被安装到~/bin目录下,因此可以在.bashrc文件中添加环境变量:

export PATH="$HOME/bin:$HOME/.local/bin:$PATH"

如果使用luke的.zshrc,则需要修改如下配置:

ZSH_THEME="ys"
# 可以解决zsh只显示缩短版本路径的问题

vim

使用luke的脚本,该脚本会配置vim和tmux的配置文件。注意,要修改.gitconfig文件中的email和name为自己的!

git clone https://github.com/LukeLike/dotfiles.git
cd dotfiles
./install.sh

需要修改一下luke的.vimrc的一些配置:

#添加以下内容,取消vim的自动折叠
set nofoldenable
set foldlevel=100
#注释以下代码,取消相对行号
" if exists('&relativenumber')
"  set relativenumber
" endif

screen/tmux

Screen是一款远程会话管理工具,能创建多个会话(Session)和窗口(Window)

screen -L -U -S test #创建并进入一个名称为test的会话(-S)
#在当前目录产生窗口0的日志screenlog.0(-L), 并用Unicode编码(-U) 
#---目前在test会话---
#快捷键适用于无法输入命令的情况
Ctrl+a c #在当前screen会话中创建窗口
Ctrl+a w #显示当前会话中的窗口列表,显示在底部
Ctrl+a n #切换到下一个窗口
Ctrl+a p #切换到上一个窗口
exit #退出当前*窗口*
Ctrl+a k #强制结束当前*窗口*
#如果exit最后一个窗口, 此会话也会终止
Ctrl+a d #效果与screen -d test相同,detach/离开当前会话
#---目前已离开test会话---
screen -ls #列出所有的screen会话, 如12345.test (Detached)
screen -r test #或者screen -r 12345, 恢复test会话

screen里的vim配色可能不正常,需要修改(当前用户的)环境变量

vim ~/.bashrc
#添加export TERM=screen-256color
source ~/.bashrc #使得bashrc生效

编辑~/.screenrc实现个性化配置,参考

altscreen on
term screen-256color
hardstatus off
hardstatus alwayslastline
hardstatus string "%{= KW} %H %{= Kw}|%{-} %-Lw%{= BW}%n%f %t%{-}%+Lw %=%C%a %Y-%M-%d"
startup_message off

这里%{= KW}表示背景色为bright black(K 类似于白灰),前景色为bright white(W 纯白),更多关于hardstatus的说明参考这里

tmux和screen类似

tmux new -s jiaxi
tmux at -t jiaxi

权限

linux中每个文件有所有者u(文件的创建者),所在组g(创建者所在组),其它组o的概念。

文件/目录权限 r(可读,使用cat命令查看内容/在目录执行ls),w(可写,编辑或删除此文件/在子目录创建文件),x(可执行,如在bash下当作命令提交给内核运行/使用cd切换进此目录)

八进制表示

0 000 --- 无权限
1 001 --x 执行
2 010 -w- 写
3 011 -wx 写和执行
4 100 r-- 只读
5 101 r-x 读和执行
6 110 rw- 读写
7 111 rwx 读写执行

ls -l (简写为ll)解析 参考链接

-rwxrw-r-- 1 root root 1314 Feb 2 09:39 abc

  • --是文件,d是目录,l是链接,还有b/c/p
  • rwx rw- r‐-:分别代表ugo的权限
  • 1:文件的硬链接数
  • root root:文件的用户u和组g
  • 1314 Feb 2 09:39 abc:文件大小(字节Byte)、最后修改日期、文件名

改变权限(chmod)

chmod 755 abc #赋予abc权限rwxr-xr-x
chmod u=rwx, g=rx, o=rx abc
#u=用户权限,g=组权限,o=不同组其他用户权限,u=rwx必须连在一起
*chmod u-x, g+w abc #给abc去除用户执行的权限,增加组写的权限
chmod a+r abc #给所有用户`a`添加读的权限

改变所有者(chown)和用户组(chgrp)

chown xiaoming abc #改变文件abc的所有者为xiaoming
chown root ./abc #改变目录abc的所有者为root
chown ‐R root ./abc #改变目录abc及其子目录的所有者为root
chgrp root abc #改变文件abc所属的组为root

其它

ls | grep a[13579]\.csv | xargs -n1 cat | grep -v "keyword" > /data/1.csv &
#1. 显示所有奇数结尾的文件
#2. 传给cat
#3. 去除(-v)包含该字段的行
#4. 重定向到一个文件
#5. &后台运行
ps #查看该命令的执行情况

Last updated on Mar 08, 2020.