Aaron Kili 发布的文章

shell 脚本调试系列 中,本文将解释第三种 shell 脚本调试模式,即 shell 跟踪,并查看一些示例来演示它如何工作以及如何使用它。

本系列的前面部分清晰地阐明了另外两种 shell 脚本调试模式:详细模式和语法检查模式,并用易于理解的例子展示了如何在这些模式下启用 shell 脚本调试。

  1. 如何在 Linux 中启用 Shell 脚本的调试模式
  2. 如何在 Shell 脚本中执行语法检查调试模式

shell 跟踪简单的来说就是跟踪 shell 脚本中的命令的执行。要打开 shell 跟踪,请使用 -x 调试选项。

这会让 shell 在终端上显示所有执行的命令及其参数。

我们将使用下面的 sys_info.sh shell 脚本,它会简要地打印出你的系统日期和时间、登录的用户数和系统的运行时间。不过,脚本中包含我们需要查找和更正的语法错误。

#!/bin/bash
# script to print brief system info
ROOT_ID="0"
DATE=`date`
NO_USERS=`who | wc -l`
UPTIME=`uptime`
check_root(){
  if [ "$UID" -ne "$ROOT_ID" ]; then
    echo "You are not allowed to execute this program!"
    exit 1;    
}
print_sys_info(){
  echo "System Time    : $DATE"
  echo "Number of users: $NO_USERS"
  echo "System Uptime  : $UPTIME
}
check_root
print_sys_info
exit 0

保存文件并执行脚本。脚本只能用 root 用户运行,因此如下使用 sudo 命令运行:

$ chmod +x sys_info.sh
$ sudo bash -x sys_info.sh

Shell Tracing - Show Error in Script

shell 跟踪 - 显示脚本中的错误

从上面的输出我们可以观察到,首先执行命令,然后其输出做为一个变量的值。

例如,先执行 date,其输出做为变量 DATE 的值。

我们可以执行语法检查来只显示其中的语法错误,如下所示:

$ sudo bash -n sys_info.sh 

Syntax Checking in Script

脚本中语法检查

如果我们审视这个 shell 脚本,我们就会发现 if 语句缺少了封闭条件的 fi 关键字。因此,让我们加上它,新的脚本应该看起来像这样:

#!/bin/bash
#script to print brief system info
ROOT_ID="0"
DATE=`date`
NO_USERS=`who | wc -l`
UPTIME=`uptime`
check_root(){
  if [ "$UID" -ne "$ROOT_ID" ]; then
    echo "You are not allowed to execute this program!"
    exit 1;
  fi    
}
print_sys_info(){
  echo "System Time    : $DATE" 
  echo "Number of users: $NO_USERS"
  echo "System Uptime  : $UPTIME
}
check_root
print_sys_info
exit 0

再次保存文件并以 root 执行,同时做语法检查:

$ sudo bash -n sys_info.sh

Perform Syntax Check in Shell Scripts

在 shell 脚本中执行语法检查

上面的语法检查操作的结果仍然显示在脚本的第 21 行还有一个错误。所以,我们仍然要纠正一些语法。

再一次分析脚本,会发现第 21 行的错误是由于在 print_sys_info 函数内最后一个 echo 命令中没有闭合双引号 "

我们将在 echo 命令中添加闭合双引号并保存文件。修改过的脚本如下:

#!/bin/bash
#script to print brief system info
ROOT_ID="0"
DATE=`date`
NO_USERS=`who | wc -l`
UPTIME=`uptime`
check_root(){
  if [ "$UID" -ne "$ROOT_ID" ]; then
    echo "You are not allowed to execute this program!"
    exit 1;
  fi
}
print_sys_info(){
  echo "System Time    : $DATE"
  echo "Number of users: $NO_USERS"
  echo "System Uptime  : $UPTIME"
}
check_root
print_sys_info
exit 0

现在再一次检查语法。

$ sudo bash -n sys_info.sh

上面的命令不会产生任何输出,因为我们的脚本语法上正确。我们也可以再次跟踪脚本执行,它应该工作得很好:

$ sudo bash -x sys_info.sh

Trace Shell Script Execution

跟踪 shell 脚本执行

现在运行脚本。

$ sudo ./sys_info.sh

Shell Script to Show Date, Time and Uptime

用 shell 脚本显示日期、时间和运行时间

shell 跟踪执行的重要性

shell 脚本跟踪可以帮助我们识别语法错误,更重要的是识别逻辑错误。例如,在 sys_info.sh shell 脚本中的 check_root 函数,它用于确定用户是否为 root,因为脚本只允许由超级用户执行。

check_root(){
  if [ "$UID" -ne "$ROOT_ID" ]; then
    echo "You are not allowed to execute this program!"
    exit 1;
  fi
}

这里的魔法是由 if 语句表达式 ["$ UID" -ne "$ ROOT_ID"] 控制的,一旦我们不使用合适的数字运算符(示例中为 -ne,这意味着不相等),我们最终可能会出一个逻辑错误。

假设我们使用 -eq (意思是等于),这将允许任何系统用户以及 root 用户运行脚本,因此是一个逻辑错误。

check_root(){
  if [ "$UID" -eq "$ROOT_ID" ]; then
    echo "You are not allowed to execute this program!"
    exit 1;
  fi
}

注意:我们在本系列开头介绍过,set 这个 shell 内置命令可以在 shell 脚本的特定部分激活调试。

因此,下面的行将帮助我们通过跟踪脚本的执行在其中找到这个逻辑错误:

具有逻辑错误的脚本:

#!/bin/bash
#script to print brief system info
ROOT_ID="0"
DATE=`date`
NO_USERS=`who | wc -l`
UPTIME=`uptime`
check_root(){
  if [ "$UID" -eq "$ROOT_ID" ]; then
    echo "You are not allowed to execute this program!"
    exit 1;
  fi
}
print_sys_info(){
  echo "System Time    : $DATE"
  echo "Number of users: $NO_USERS"
  echo "System Uptime  : $UPTIME"
}
#turning on and off debugging of check_root function
set -x ; check_root;  set +x ;
print_sys_info
exit 0

保存文件并调用脚本,在输出中,我们可以看到一个普通系统用户可以在未 sudo 的情况下运行脚本。 这是因为 USER_ID 的值为 100,不等于为 0 的 root 的 ROOT_ID

$ ./sys_info.sh

Run Shell Script Without Sudo

未 sudo 的情况下运行 shell 脚本

那么,现在我们已经完成了 shell 脚本调试系列,可以在下面的反馈栏里给我们关于本篇或者本系列提出问题或反馈。


作者简介:

Aaron Kili 是 Linux 和 F.O.S.S 爱好者,将来的 Linux SysAdmin、web 开 发人员,目前是 TecMint 的内容创作者,他喜欢用电脑工作,并坚信分享知识。


via: http://www.tecmint.com/trace-shell-script-execution-in-linux/

作者:Aaron Kili 译者:geekpi 校对:jasminepeng

本文由 LCTT 原创编译,Linux中国 荣誉推出

我非常喜欢使用命令,因为它们比 GUI(图形用户界面)应用程序对 Linux 系统提供更多的控制,因此,我一直在寻找一些有趣的方法让 Linux 的操作变得简单好玩,主要是基于终端操作。

当我们发现使用 Linux 的新技巧时,尤其是像我这样的命令行极客,我们总会感到非常来劲。

建议阅读: 5 有趣的 Linux 命令行技巧 - 第一部分

而且我们也会很想与数百万 Linux 用户分享新学到的实践或命令,特别是那些还在使用自己的方式操作这个令人兴奋的操作系统的新手们。

建议阅读: 10 个对新手有用的 Linux 命令行技巧 - 第二部分

在这篇文章中,我们将回顾一系列有用的命令行小技巧,它们可以显著地提高你的 Linux 使用技能。

1、 在 Linux 中锁定或隐藏文件或目录

锁定文件或目录最简单的方法是使用 Linux 文件权限。如果你是文件或目录的所有者,你可以阻止其他用户和组访问(删除、读取、写入、执行)它,如下所示:

$ chmod 700 tecmint.info
或
$ chmod go-rwx tecmint.info

想要了解更多有关 Linux 文件权限的内容,请阅读这篇文章在 Linux 中管理用户和组,文件权限和属性

为了实现对系统中的其他用户隐藏文件或目录,可以通过在文件或目录开头添加 . 的方式重命名:

$ mv filename .tecmint.info

2、 在 Linux 中将 rwx 权限转为八进制格式

默认情况下,当你运行 ls 命令之后,它会使用 rwx 格式显示文件权限,为了了解 rwx 格式和八进制格式的等同性,你可以学习如何在 Linux 中将 rwx 权限转为八进制格式

3、 当 sudo 命令执行失败时怎么使用 su 命令

虽然 sudo 命令被用来以超级用户权限执行命令,但是在某些情况下它也会执行失败,如下所示。

在这里,我想清空一个大文件的内容,其文件名为 uptime.log,但是即便我是使用 sudo 命令也执行失败了。

$ cat /dev/null >/var/log/uptime.log
$ sudo cat /dev/null >/var/log/uptime.log

在 Linux 中清空大文件的内容

在 Linux 中清空大文件的内容

遇到这种情况,你需要使用 su 命令切换到 root 用户,然后像下面这样去执行清空操作:

$ su
$ sudo cat /dev/null >/var/log/uptime.log
$ cat /var/log/uptime.log

切换到超级用户

切换到超级用户

尝试理解 su 和 sudo 之间的区别,另外,通过阅读它们的手册页以了解更多的使用指南:

$ man sudo
$ man su

4、 在 Linux 中结束一个进程

有些时候,当你想使用 kill、killall、pkill 命令结束一个进程时,它们有可能无法生效,你可能会看到该进程仍然还在系统上运行。

如果要强制结束一个进程,可以发送 -KILL 信号给该进程。

首先获取指定进程 ID,然后像下面这样结束该进程:

$ pidof vlc
$ sudo kill -KILL 10279

在 Linux 中查找和结束进程

在 Linux 中查找和结束进程

查看 kill 命令以获取更多的使用选项和信息。

5、 在 Linux 中永久删除文件

一般情况下,我们通过使用 rm 命令将文件从 Linux 系统中删除。然而,这些文件并没有被真正的删除,它们仍被存储在那里并隐藏在你的硬盘中,其他用户仍然可以在 Linux 中恢复删除的文件并查看。

为了防止这种情况发生,我们可以使用 shred 命令来覆写文件内容,并在覆盖完成后选择删除文件。

$ shred -zvu tecmint.pdf

上述命令中所使用的选项说明:

  1. -z – 最后一次使用 0 进行覆盖以隐藏覆写动作。
  2. -u – 覆写后截断并移除文件。
  3. -v – 显示详细过程。

在 Linux 中永久删除文件

在 Linux 中永久删除文件

阅读 shred 手册以获取更多的使用信息。

$ man shred

6、 在 Linux 中重命名多个文件

你可以通过使用 rename 命令随时在 Linux 中重命名多个文件

rename 命令会根据第一个参数中的规则重命名指定文件。

以下命令会将所有 .pdf 文件重命名为 .doc 文件,使用的规则为 's/\.pdf$/\.doc/'

$ rename -v 's/\.pdf$/\.doc/' *.pdf

在 Linux 中重命名多个文件

在 Linux 中重命名多个文件

在接下来的例子中,我们将通过重命名所有匹配 "*.bak" 的文件来移除其拓展名,使用的规则是 's/\e.bak$//'

$ rename -v 's/\e.bak$//' *.bak

7、 在 Linux 中检查单词拼写

look 命令用于显示文件中以指定字符串为前缀的任意行,同时它也可以帮你检查命令行中给定单词的拼写。尽管它并不是那么有效和可靠,但它仍然算得上是其他强大的拼写检查工具的有用替代品。

$ look linu
$ look docum

在 Linux 中检查单词拼写

在 Linux 中检查单词拼写

8、 按关键字搜索手册页

man 命令用于显示命令的手册页,当使用 -k 选项时,它会将关键字 printf(或者如下命令中的关键字 adjustapachephp )作为正则表达式,来搜索所有匹配该名称手册页,并显示其简介。

$ man -k adjust
$ man -k apache
$ man -k php

按关键字搜索手册页

按关键字搜索手册页

9、 在 Linux 中实时监测日志

watch 命令可以定期执行另一个 Linux 命令并全屏显示该命令的执行结果。当 watch 命令与 tail 命令(用于查看文件结尾的 Linux 命令)配合使用时,可以监测到日志文件的日志记录情况。

在以下示例中,你将实时监测系统认证日志文件。打开两个终端窗口,在第一个窗口中实时监测该日志文件,如下:

$ sudo watch tail /var/log/auth.log

你也可以使用 tail 命令(显示文件结尾的 Linux 命令)的 -f 选项实时监测文件变化。这样,我们就可以在日志文件中看到日志的生成情况。

$ sudo tail -f /var/log/auth.log

接着,在第二个终端窗口中运行以下命令,之后,你就可以在第一个终端窗口中观察日志文件内容:

$ sudo mkdir -p /etc/test
$ sudo rm -rf /etc/test

10、 列出所有 Shell 内置命令

shell 内置命令是一个命令或者函数,从内部调用并直接在 shell 里执行,而不是从硬盘加载外部的可执行程序来执行。

列出所有 shell 内置命令及其语法,执行如下命令:

$ help

作为结束语,命令行小技巧不仅能派得上用场,而且让学习和使用 Linux 变得更加简单有趣,尤其是对新手来讲。

你也可以通过留言给我们分享其他在 Linux 中有用有趣的命令行小技巧


作者简介:

Aaron Kili 是一名 Linux 和 F.O.S.S 的爱好者,未来的 Linux 系统管理员、网站开发人员,目前是 TecMint 的写作者,他喜欢用电脑工作,并且乐于分享知识。


via: http://www.tecmint.com/linux-command-line-tricks-and-tips-worth-knowing/

作者:Aaron Kili 译者:zhb127 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

在数千个 Linux 系统上的命令/程序中,知道给定命令的类型和目的以及其在系统上的位置(绝对路径)对于新手来说可能是一个挑战。

知道命令/程序的一些细节不仅有助于 Linux 用户掌握大量命令,还能使用户理解命令行或脚本在系统上的操作。

因此,在本文中我们将向你解释五个有用的命令,用于显示给定命令的简短描述和位置。

要在系统上发现新命令,请查看 PATH 环境变量中的所有目录。这些目录存储系统上安装的所有命令/程序。

一旦你找到一个有趣的命令,在继续阅读更多关于它的手册页之前,请尝试如下收集一些简要的信息。

假设你输出了 PATH 的值,然后进到其中的一个目录 /usr/local/bin,注意到一个名为 fswatch(监视文件修改更改)的新命令:

$ echo $PATH
$ cd /usr/local/bin

Find New Commands in Linux

在 Linux 中找出新命令

现在让我们在 Linux 中用不同的方法找出 fswatch 命令的描述和位置。

1、 whatis 命令

whatis 用于显示你作为参数输入的命令名的单行描述(例如下面命令中的 fswatch)。

如果描述太长,一些部分在默认情况下会被省略,使用 -l 标志来显示完整的描述。

$ whatis fswatch
$ whatis -l fswatch

Linux whatis Command Example

Linux whatis 命令示例

2、 apropos 命令

apropos 会搜索手册页名称和关键字描述(以命令名作为正则表达式搜索)。

使用 -l 标志来显示完整的描述。

$ apropos fswatch 
$ apropos -l fswatch

Linux apropos Command Example

Linux apropos 命令示例

默认上,apropos 会如示例那样输出所有匹配的行。你可以使用 -e 选项来精确匹配:

$ apropos fmt
$ apropos -e fmt

Linux apropos Command Show by Keyword

Linux apropos 命令根据关键词显示

3、 type 命令

type 命令会输出给定命令的完整路径名,此外,如果输入的命令名不是做为独立存储在磁盘的文件的程序,type 还会告诉你命令分类:

  • shell 内置命令
  • shell 关键字或保留字
  • 别名
$ type fswatch 

Linux type Command Example

Linux type 命令示例

当命令是另外一个命令的别名时,type 会显示运行别名时所执行的命令。使用 alias 命令可以查看你系统上创建的所有别名:

$ alias
$ type l
$ type ll

Show All Aliases in Linux

显示 Linux 中所有别名

4、 which 命令

which 可以帮助命令定位命令,它会打印出命令的绝对路径:

$ which fswatch 

Find Linux Command Location

找出 Linux 命令位置

一些二进制文件存在于 PATH 环境变量中的多个目录,使用 -a 标志来找出所有匹配的路径名。

5、 whereis 命令

whereis 定位指定命令名的二进制、源和帮助页文件,如下所示:

$ whereis fswatch
$ whereis mkdir 
$ whereis rm

Linux whereis Command Example

Linux whereis 命令示例

虽然上面的命令对于查找关于命令/程序的一些快速信息很重要,但是该命令的手册总是可以提供完整的文档,它还包括其他相关程序的列表:

$ man fswatch

在本文中,我们回顾了五个简单的命令,用于显示命令的简短的手册描述和位置。 你可以在反馈栏中对此文章做出贡献或提出问题。


作者简介:

Aaron Kili 是 Linux 和 F.O.S.S 爱好者,将来的 Linux SysAdmin、web 开发人员,目前是 TecMint 的内容创作者,他喜欢用电脑工作,并坚信分享知识。


via: http://www.tecmint.com/find-linux-command-description-and-location/

作者:Aaron Kili 译者:geekpi 校对:jasminepeng

本文由 LCTT 原创编译,Linux中国 荣誉推出

现今,大多数(如果不是全部的话)现代 Linux 发行版的默认 shell 都是 Bash。然而,你可能已经注意到这样一个现象,在各个发行版中,其终端配色和提示内容都各不相同。

如果你一直都在考虑,或者只是一时好奇,如何定制可以使 Bash 更好用。不管怎样,请继续读下去 —— 本文将告诉你怎么做。

PS1 Bash 环境变量

命令提示符和终端外观是通过一个叫 PS1 的变量来进行管理的。根据 Bash 手册页说明,PS1 代表了 shell 准备好读取命令时显示的主体的提示字符串。

PS1 所允许的内容包括一些反斜杠转义的特殊字符,可以查看手册页中 PRMPTING 部分的内容来了解它们的含义。

为了演示,让我们先来显示下我们系统中 PS1 的当前内容吧(这或许看上去和你们的有那么点不同):

$ echo $PS1
[\u@\h \W]\$

现在,让我们来了解一下怎样自定义 PS1 吧,以满足我们各自的需求。

自定义 PS1 格式

根据手册页 PROMPTING 章节的描述,下面对各个特殊字符的含义作如下说明:

  • \u: 显示当前用户的 用户名
  • \h: 完全限定域名 Fully-Qualified Domain Name (FQDN)中第一个点(.)之前的主机名
  • \W: 当前工作目录的基本名,如果是位于 $HOME (家目录)通常使用波浪符号简化表示(~)。
  • \$: 如果当前用户是 root,显示为 #,否则为 $

例如,如果我们想要显示当前命令的历史数量,可以考虑添加 \!;如果我们想要显示 FQDN 全称而不是短服务器名,那么可以考虑添加 \H

在下面的例子中,我们同时将这两个特殊字符引入我们当前的环境中,命令如下:

PS1="[\u@\H \W \!]\$"

当按下回车键后,你将会看到提示内容会变成下面这样。可以对比执行命令修改前和修改后的提示内容:

Customize Linux Terminal Prompt PS1

自定义 Linux 终端提示符 PS1

现在,让我们再深入一点,修改命令提示符中的用户名和主机名 —— 同时修改文本和环境背景。

实际上,我们可以对提示符进行 3 个方面的自定义:

文本格式前景色(文本)背景色
0: 常规文本30: 黑色40: 黑色
1: 加粗文本31: 红色41: 红色
4: 下划线文本32: 绿色42: 绿色
33: 黄色43: 黄色
34: 蓝色44: 蓝色
35: 紫色45: 紫色
36: 青色46: 青色
37: 白色47: 白色

我们将在开头使用 \e 特殊字符,跟着颜色序列,在结尾使用 m 来表示结束。

在该序列中,三个值(背景格式前景)由分号分隔(如果不赋值,则假定为默认值)。

建议阅读: 在 Linux 中学习 Bash shell 脚本

此外,由于值的范围不同,指定背景,格式,或者前景的先后顺序没有关系。

例如,下面的 PS1 将导致提示符为黄色带下划线文本,并且背景为红色:

PS1="\e[41;4;33m[\u@\h \W]$ "

Change Linux Terminal Color Prompt PS1

修改 Linux 终端提示符配色 PS1

虽然它看起来那么漂亮,但是这个自定义将只会持续到当前用户会话结束。如果你关闭终端,或者退出本次会话,所有修改都会丢失。

为了让修改永久生效,你必须将下面这行添加到 ~/.bashrc或者 ~/.bash_profile,这取决于你的版本。

PS1="\e[41;4;33m[\u@\h \W]$ "

尽情去玩耍吧,你可以尝试任何色彩,直到找出最适合你的。

(LCTT 译注:原文的这种设置,不但会影响到提示符,也会影响到输入和显示的其它文字,因此应该在 PS1 设置中使用 \e[0m 来结束颜色设置。如:PS1="\e[41;4;33m[\u@\h \W]$\e[0m "

小结

在本文中,我们讲述了如何来自定义 Bash 提示符的配色和提示内容。如果你对本文还有什么问题或者建议,请在下面评论框中写下来吧。我们期待你们的声音。


作者简介:

Aaron Kili 是一位 Linux 及 F.O.S.S 的狂热爱好者,一位未来的 Linux 系统管理员,web 开发者,而当前是 TechMint 的原创作者,他热爱计算机工作,并且信奉知识分享。


via: http://www.tecmint.com/customize-bash-colors-terminal-prompt-linux/

作者:Aaron Kili 译者:GOLinux 校对:jasminepeng

本文由 LCTT 原创编译,Linux中国 荣誉推出

在本文中,我们将解释两个简单的命令行小技巧,它可以帮你只列出所有的今天的文件。

Linux 用户在命令行上遇到的常见问题之一是定位具有特定名称的文件,如果你知道确定的文件名则可能会容易得多。

不过,假设你忘记了白天早些时候创建的文件的名称(在你包含了数百个文件的 home 文件夹中),但现在你有急用。

下面用不同的方式只列出所有你今天创建或修改的文件(直接或间接)。

1、 使用 ls 命令,只列出你的 home 文件夹中今天的文件。

# ls  -al --time-style=+%D | grep 'date +%D'

其中:

  • -a - 列出所有文件,包括隐藏文件
  • -l - 启用长列表格式
  • --time-style=FORMAT - 显示指定 FORMAT 的时间
  • +%D - 以 %m/%d/%y (月/日/年)格式显示或使用日期

Find Recent Files in Linux

在Linux中找出最近的文件

此外,你使用可以 -X 标志来按字母顺序对结果排序

# ls -alX --time-style=+%D | grep 'date +%D'

你也可以使用 -S 标志来基于大小(由大到小)来排序:

# ls -alS --time-style=+%D | grep 'date +%D'

2、 另外,使用 find 命令会更灵活,并且提供比 ls 更多的选项,可以实现相同的目的。

  • -maxdepth 级别用于指定在搜索操作的起点下(在这个情况下为当前目录)的搜索层级(子目录层级数)。
  • -newerXY,用于所寻找的文件的时间戳 X 比参照文件的时间戳 Y 更新一些的文件。 XY 表示以下任何字母: - a - 参照文件的访问时间 - B - 参照文件的创建时间 - c - 参照文件的 inode 状态改变时间 - m - 参照文件的修改时间 - t - 直接指定一个绝对时间

下面的命令意思是只找出 2016-12-06 这一天修改的文件:

# find . -maxdepth 1 -newermt "2016-12-06"

Find Today's Files in Linux

在 Linux 中找出今天的文件

重要:在上面的 find 命令中使用正确的日期格式作为参照时间,一旦你使用了错误的格式,你会得到如下错误:

# find . -maxdepth 1 -newermt "12-06-2016"
find: I cannot figure out how to interpret '12-06-2016' as a date or time

或者,使用下面的正确格式:

# find . -maxdepth 1 -newermt "12/06/2016"
或者
# find . -maxdepth 1 -newermt "12/06/16"

Find Todays Modified Files in Linux

在 Linux 中找出今天修改的文件

你可以在我们的下面一系列文章中获得 lsfind 命令的更多使用信息。

在本文中,我们解释了如何使用 ls 和 find 命令帮助只列出今天的文件。 请使用以下反馈栏向我们发送有关该主题的任何问题或意见。 你也可以提醒我们其他可以用于这个目的的命令。


作者简介:Aaron Kili是一名 Linux 和 F.O.S.S 的爱好者,未来的 Linux 系统管理员、网站开发人员,目前是 TecMint 的内容创作者,他喜欢用电脑工作,并乐于分享知识。


via: http://www.tecmint.com/find-recent-modified-files-in-linux/

作者:Aaron Kili 译者:geekpi 校对:jasminepeng

本文由 LCTT 原创编译,Linux中国 荣誉推出

在大多数情况下,Linux 系统管理员使用 SSH 登录到程 Linux 服务器时,要么是通过密码,要么是无密码 SSH 登录或基于密钥的 SSH 身份验证。

如果你想自动在 SSH 登录提示符中提供密码用户名怎么办?这时 sshpass 就可以帮到你了。

sshpass 是一个简单、轻量级的命令行工具,通过它我们能够向命令提示符本身提供密码(非交互式密码验证),这样就可以通过 cron 调度器执行自动化的 shell 脚本进行备份。

ssh 直接使用 TTY 访问,以确保密码是用户键盘输入的。 sshpass 在专门的 tty 中运行 ssh,以误导 ssh 相信它是从用户接收到的密码。

重要:使用 sshpass 是最不安全的,因为所有系统上的用户在命令行中通过简单的 “ps” 命令就可看到密码。因此,如果必要,比如说在生产环境,我强烈建议使用 SSH 无密码身份验证

在 Linux 中安装 sshpass

在基于 RedHat/CentOS 的系统中,首先需要启用 EPEL 仓库并使用 yum 命令安装它。

# yum install sshpass
# dnf install sshpass    [Fedora 22 及以上版本]

在 Debian/Ubuntu 和它的衍生版中,你可以使用 apt-get 命令来安装。

$ sudo apt-get install sshpass

另外,你也可以从最新的源码安装 sshpass,首先下载源码并从 tar 文件中解压出内容:

$ wget http://sourceforge.net/projects/sshpass/files/latest/download -O sshpass.tar.gz
$ tar -xvf sshpass.tar.gz
$ cd sshpass-1.06
$ ./configure
# sudo make install 

如何在 Linux 中使用 sshpass

sshpassssh 一起使用,使用下面的命令可以查看 sshpass 的使用选项的完整描述:

$ sshpass -h

下面为显示的 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 "SSHPASS"
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

正如我之前提到的,sshpass 在用于脚本时才更可靠及更有用,请看下面的示例命令。

使用用户名和密码登录到远程 Linux ssh 服务器(10.42.0.1),并检查文件系统磁盘使用情况,如图所示。

$ sshpass -p 'my_pass_here' ssh [email protected] 'df -h' 

重要提示:此处,在命令行中提供了密码,这是不安全的,不建议使用此选项。

sshpass - Linux Remote Login via SSH

sshpass – 使用 SSH 远程登录 Linux

但是,为了防止在屏幕上显示密码,可以使用 -e 标志,并将密码作为 SSHPASS 环境变量的值输入,如下所示:

$ export SSHPASS='my_pass_here'
$ echo $SSHPASS
$ sshpass -e ssh [email protected] 'df -h' 

sshpass - Hide Password in Prompt

sshpass – 在终端中隐藏密码

注意:在上面的示例中,SSHPASS 环境变量仅用于临时目的,并将在重新启动后删除。

要永久设置 SSHPASS 环境变量,打开 /etc/profile 文件,并在文件开头输入 export 语句:

export SSHPASS='my_pass_here'

保存文件并退出,接着运行下面的命令使更改生效:

$ source /etc/profile 

另外,也可以使用 -f 标志,并把密码放在一个文件中。 这样,您可以从文件中读取密码,如下所示:

$ sshpass -f password_filename ssh [email protected] 'df -h'

sshpass - Supply Password File to Login

sshpass – 在登录时提供密码文件

你也可以使用 sshpass 通过 scp 传输文件或者 rsync 备份/同步文件,如下所示:

------- Transfer Files Using SCP ------- 
$ scp -r /var/www/html/example.com --rsh="sshpass -p 'my_pass_here' ssh -l aaronkilik" 10.42.0.1:/var/www/html
------- Backup or Sync Files Using Rsync -------
$ rsync --rsh="sshpass -p 'my_pass_here' ssh -l aaronkilik" 10.42.0.1:/data/backup/ /backup/

更多的用法,建议阅读 sshpass 的 man 页面,输入:

$ man sshpass

在本文中,我们解释了 sshpass 是一个非交互式密码验证的简单工具。 虽然这个工具可能是有帮助的,但还是强烈建议使用更安全的 ssh 公钥认证机制。

请在下面的评论栏写下任何问题或评论,以便可以进一步讨论。


作者简介:Aaron Kili 是一位 Linux 和 F.O.S.S 爱好者,未来的 Linux 系统管理员,web 开发人员, 还是 TecMint 原创作者,热爱电脑工作,并乐于分享知识。


via: http://www.tecmint.com/sshpass-non-interactive-ssh-login-shell-script-ssh-password/

作者:Aaron Kili 译者:geekpi 校对:jasminepeng

本文由 LCTT 原创编译,Linux中国 荣誉推出