2018年2月

当你使用命令行的时候,无论什么时候,你都位于一个目录中,它告诉了命令行当前所位于的完整目录。在 Linux 中,你可以使用 rm 命令删除目录,但是首先,你需要使用 mkdir 命令来创建目录。在这篇教程中,我将使用一些易于理解的例子来讲解这个工具的基本用法。

在开始之前,值得一提的是,这篇教程中的所有例子都已经在 Ubuntu 16.04 LTS 中测试过。

Linux mkdir 命令

正如上面所提到的,用户可以使用 mkdir 命令来创建目录。它的语法如下:

mkdir [OPTION]... DIRECTORY...

下面的内容是 man 手册对这个工具的描述:

如果目录还不存在,则创建之。

下面这些 Q&A 式的例子将能够帮助你更好的理解 mkdir 这个命令是如何工作的。

Q1. 如何使用 mkdir 命令创建目录?

创建目录非常简单,你唯一需要做的就是把你想创建的目录的名字跟在 mkdir 命令的后面作为参数。

mkdir [dir-name]

下面是一个简单例子:

mkdir test-dir

Q2. 如何确保当父目录不存在的时候,同时创建父目录?

有时候,我们需要使用一条 mkdir 命令来创建一个完整的目录结构,这时候,你只需要使用 -p 这个命令行选项即可。

比如,你想创建目录 dir1/dir2/dir3,但是,该目录的父目录都不存在,这时候,你可以像下面这样做:

mkdir -p dir1/dir2/dir3

How to make sure parent directories (if non-existent) are created

Q3. 如何在创建目录时自定义权限?

默认情况下,mkdir 命令创建目录时会把权限设置为 rwx, rwx, r-x

How to set permissions for directory being created

但是,如果你想自定义权限,那么你可以使用 -m 这一命令行选项。

mkdir -m command option

Q4. 如何使 mkdir 命令显示操作细节?

如果你希望 mkdir 命令显示它所执行的操作的完整细节,那么你可以使用 -v 这一命令行选项。

mkdir -v [dir]

下面是一个例子:

How to make mkdir emit details of operation

结论

你已经看到,mkdir 是一个非常简单,易于理解和使用的命令。学习这一命令不会遇到任何屏障。在这篇教程中,我们讨论到了它的绝大部分命令行选项。记得练习这些命令,并在日复一日的工作中使用这些命令。如果你想了解关于这一命令的更过内容,请查看它的 man 手册。


via: https://www.howtoforge.com/linux-mkdir-command/

作者:Himanshu Arora 译者:ucasFL 校对:wxy

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

目标

了解特殊权限的工作原理,以及如何识别和设置它们。

要求

难度

简单

约定

  • # - 要求直接以 root 用户或使用 sudo 命令执行指定的命令
  • $ - 用普通的非特权用户来执行指定的命令

介绍

通常,在类 Unix 操作系统上,文件和目录的所有权是基于文件创建者的默认 uid(user-id)和 gid(group-id)的。启动一个进程时也是同样的情况:它以启动它的用户的 uidgid 运行,并具有相应的权限。这种行为可以通过使用特殊的权限进行改变。

setuid 位

当使用 setuid (设置用户 ID)位时,之前描述的行为会有所变化,所以当一个可执行文件启动时,它不会以启动它的用户的权限运行,而是以该文件所有者的权限运行。所以,如果在一个可执行文件上设置了 setuid 位,并且该文件由 root 拥有,当一个普通用户启动它时,它将以 root 权限运行。显然,如果 setuid 位使用不当的话,会带来潜在的安全风险。

使用 setuid 权限的可执行文件的例子是 passwd,我们可以使用该程序更改登录密码。我们可以通过使用 ls 命令来验证:

ls -l /bin/passwd
-rwsr-xr-x. 1 root root 27768 Feb 11 2017 /bin/passwd

如何识别 setuid 位呢?相信您在上面命令的输出已经注意到,setuid 位是用 s 来表示的,代替了可执行位的 x。小写的 s 意味着可执行位已经被设置,否则你会看到一个大写的 S。大写的 S 发生于当设置了 setuidsetgid 位、但没有设置可执行位 x 时。它用于提醒用户这个矛盾的设置:如果可执行位未设置,则 setuidsetgid 位均不起作用。setuid 位对目录没有影响。

setgid 位

setuid 位不同,setgid (设置组 ID)位对文件和目录都有影响。在第一个例子中,具有 setgid 位设置的文件在执行时,不是以启动它的用户所属组的权限运行,而是以拥有该文件的组运行。换句话说,进程的 gid 与文件的 gid 相同。

当在一个目录上使用时,setgid 位与一般的行为不同,它使得在所述目录内创建的文件,不属于创建者所属的组,而是属于父目录所属的组。这个功能通常用于文件共享(目录所属组中的所有用户都可以修改文件)。就像 setuid 一样,setgid 位很容易识别(我们用 test 目录举例):

ls -ld test
drwxrwsr-x. 2 egdoc egdoc 4096 Nov 1 17:25 test

这次 s 出现在组权限的可执行位上。

sticky 位

sticky (粘连)位的工作方式有所不同:它对文件没有影响,但当它在目录上使用时,所述目录中的所有文件只能由其所有者删除或移动。一个典型的例子是 /tmp 目录,通常系统中的所有用户都对这个目录有写权限。所以,设置 sticky 位使用户不能删除其他用户的文件:

$ ls -ld /tmp
drwxrwxrwt. 14 root root 300 Nov 1 16:48 /tmp

在上面的例子中,目录所有者、组和其他用户对该目录具有完全的权限(读、写和执行)。sticky 位在可执行位上用 t 来标识。同样,小写的 t 表示可执行权限 x也被设置了,否则你会看到一个大写字母 T

如何设置特殊权限位

就像普通的权限一样,特殊权限位可以用 chmod 命令设置,使用数字或者 ugo/rwx 格式。在前一种情况下,setuidsetgidsticky 位分别由数值 4、2 和 1 表示。例如,如果我们要在目录上设置 setgid 位,我们可以运行:

$ chmod 2775 test

通过这个命令,我们在目录上设置了 setgid 位(由四个数字中的第一个数字标识),并给它的所有者和该目录所属组的所有用户赋予全部权限,对其他用户赋予读和执行的权限(目录上的执行位意味着用户可以 cd 进入该目录或使用 ls 列出其内容)。

另一种设置特殊权限位的方法是使用 ugo/rwx 语法:

$ chmod g+s test

要将 setuid 位应用于一个文件,我们可以运行:

$ chmod u+s file

要设置 sticky 位,可运行:

$ chmod o+t test

在某些情况下,使用特殊权限会非常有用。但如果使用不当,可能会引入严重的漏洞,因此使用之前请三思。


via: https://linuxconfig.org/how-to-use-special-permissions-the-setuid-setgid-and-sticky-bits

作者:Egidio Docile 译者:jessie-pang 校对:wxy

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

默认的情况下,我们的 ntpd/NTP 服务器会监听所有的端口或者 IP 地址,也就是:0.0.0.0:123。 怎么才可以在一个 Linux 或是 FreeBSD Unix 服务器上,确保只监听特定的 IP 地址,比如 localhost 或者是 192.168.1.1:123

NTP 是 网络时间协议 Network Time Protocol 的首字母简写,这是一个用来同步两台电脑之间时间的协议。ntpd 是一个操作系统守护进程,可以设置并且保证系统的时间与互联网标准时间服务器同步。

NTP 使用 /etc/directory 之下的 ntp.conf 作为配置文件。

/etc/ntp.conf 之中的端口指令

你可以通过设置端口命令来防止 ntpd 监听 0.0.0.0:123,语法如下:

interface listen IPv4|IPv6|all
interface ignore IPv4|IPv6|all
interface drop IPv4|IPv6|all

上面的配置可以使 ntpd 监听那个地址或者不出来任何请求而直接丢弃。ignore 会防止打开匹配的地址,drop 会导致 ntpd 打开该地址并丢弃所有接收到的包,而不做任何检查。举个例子,如果要忽略所有端口之上的监听,加入下面的语句到 /etc/ntp.conf

interface ignore wildcard

如果只监听 127.0.0.1 和 192.168.1.1 则是这样:

interface listen 127.0.0.1
interface listen 192.168.1.1

这是我 FreeBSD 云服务器上的样例 /etc/ntp.conf 文件:

$ egrep -v '^#|$^' /etc/ntp.conf

样例输出为:

tos minclock 3 maxclock 6
pool 0.freebsd.pool.ntp.org iburst
restrict    default limited kod nomodify notrap noquery nopeer
restrict -6 default limited kod nomodify notrap noquery nopeer
restrict    source  limited kod nomodify notrap noquery
restrict 127.0.0.1
restrict -6 ::1
leapfile "/var/db/ntpd.leap-seconds.list"
interface ignore wildcard
interface listen 172.16.3.1
interface listen 10.105.28.1

重启 ntpd

在 FreeBSD Unix 之上重新加载/重启 ntpd:

$ sudo /etc/rc.d/ntpd restart

或者 在 Debian 和 Ubuntu Linux 之上使用下面的命令

$ sudo systemctl restart ntp

或者 在 CentOS/RHEL 7/Fedora Linux 之上使用下面的命令

$ sudo systemctl restart ntpd

校验

使用 netstatss 命令来检查 ntpd 只绑定到了特定的 IP 地址:

$ netstat -tulpn | grep :123

或是:

$ ss -tulpn | grep :123

样例输出:

udp        0      0 10.105.28.1:123         0.0.0.0:*                           -               
udp        0      0 172.16.3.1:123          0.0.0.0:*                           -

在 FreeBSD Unix 服务器上使用 sockstat 命令

$ sudo sockstat
$ sudo sockstat -4
$ sudo sockstat -4 | grep :123

样例输出:

root     ntpd       59914 22 udp4   127.0.0.1:123         *:*
root     ntpd       59914 24 udp4   127.0.1.1:123         *:*

作者是 nixCraft 的创始人并且是一位经验丰富的系统管理员、DevOps 工程师,也是一名 Linux 操作系统和 Unix shell 脚本的训练师。他为全球不同行业,包括 IT、教育业、安全防护、空间研究和非营利性组织的客户工作。关注他的 Twitter, Facebook, Google+


via: https://www.cyberciti.biz/faq/how-to-bind-ntpd-to-specific-ip-addresses-on-linuxunix/

作者:Vivek Gite 译者:Drshu 校对:wxy

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

当你在 ps aux 的输出中看到 sshd:root@notty 时会觉得很奇怪吧,notty 算是哪门子的主机,是不是黑客计算机的名字啊。不过不用担心;notty 仅仅是表示 没有 tty 而已。

当你在本地登录 Linux 机器时,登录终端会在进程列表中显示为 tty( 比如,tty7)。若你通过 ssh 登录一台远程服务器,则会看到类似 root@pts/0 这样的东西。

而若某个连接是由 sftp 或者是由 scp 拷贝文件而创建的,则该连接会会显示成没有 tty (notty)。

如果你仍然想知道服务器上发生了什么事情,可以检查 ps auxf 的输出来查看进程树,或者运行 netstat -vatn 来检查所有的 TCP 连接。


via: http://www.sysadminworld.com/2011/ps-aux-shows-sshd-rootnotty/

作者:sysadminworld 译者:lujun9972 校对:wxy

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

我们有三个理由来说明 Pygame 对初学编程者是最好的选择。

 title=

上个月,Scott Nesbitt 发表了一篇标题为 Mozilla 支出 50 万美元来支持开源项目的文章。其中一个基于 HTML/JavaScript 的游戏平台项目 Phaser 获得了 50,000 美元的奖励。整整一年里,我都在使用 Phaser 平台来教我的小女儿,用来学习的话,它是最简单也是最好的 HTML 游戏开发平台。然而,对于初学者来说,使用 Pygame 也许效果更好。原因如下:

1、 小段代码块

Pygame,基于计算机课程中最流行的语言 Python。Python 非常适合用一小段代码来实现我们的想法,孩子们可以从单个文件和单个代码块起开始学习,在掌握函数(function)或类(class)对象之前,就可以写出意大利面条似的代码。 很像手指画,所想即所得。

以这样的方式来学习,当编写的代码越来越难于管理的时候,孩子们很自然的就会把代码分解成函数模块和类模块。在学习函数之前就学习了 Python 语言的语法,学生将掌握基本的编程知识,对了解全局作用域和局部作用域起到更好的作用。

大多数 HTML 游戏在一定程度上会将结构、样式和编程逻辑分为 HTML、CSS 和 JavaScript,并且需要 CSS 和 HTML 的知识。从长远来看,虽然拆分更好,但对初学者来说是个障碍。一旦孩子们发现他们可以用 HTML 和 CSS 快速构建网页,很有可能就会被颜色、字体和图形的视觉刺激分散注意力。即使仅仅只专注于 JavaScript 代码,也需要学习基本的文档结构模型(DOM),以使 JavaScript 代码能够嵌入进去。

2、 全局变量更清晰

Python 和 JavaScript 都使用动态类型变量,这意味着变量只有在赋值才能确定其类型是一个字符串、一个整数还是一个浮点数,然而在 JavaScript 更容易出错。类似于类型变量,JavaScript 和 Python 都有全局变量和局部变量之分。Python 中,如果在函数块内要使用全局变量,就会以 global 关键字区分出来。

要理解在 Phaser 上教授编程初学者所面临的挑战的话,让我们以基本的制作您的第一个 Phaser 游戏教程为例子,它是由 Alvin Ourrad 和 Richard Davey 开发制作的。在 JavaScript 中,程序中任何地方都可以访问的全局变量很难追踪调试,常常引起 Bug 且很难解决。因为 Richard 和 Alvin 是专业程序员,所以在这儿特意使用全局变量以使程序简洁。

var game = new Phaser.Game(800, 600, Phaser.AUTO, '', { preload: preload, create: create, update: update });

function preload() {

    game.load.image('sky', 'assets/sky.png');

}

var player;
var platforms;

function create() {
    game.physics.startSystem(Phaser.Physics.ARCADE);
...

在他们的 Phaser 编程手册 《Interphase》 中,Richard Davey 和 Ilija Melentijevic 解释说:在很多 Phaser 项目中通常都会使用全局变量,原因是使用它们完成任务更容易、更快捷。

“如果您开发过游戏,只要代码量到一定规模,那么(使用全局变量)这种做法会使您陷入困境的,可是我们为什么还要这样做?原因很简单,仅仅只是要使我们的 Phaser 项目容易完成,更简单而已。”

针对一个 Phaser 应用程序,虽然可以使用局部变量和拆分代码块来达到关注点隔离这些手段来重构代码,但要使第一次学习编程的小孩能理解,显然很有难度的。

如果您想教你的孩子学习 JavaScript,或者如果他们已经知道怎样使用像 Python 来编程的话,有个好的 Phaser 课程推荐: 完整的手机游戏开发课程,是由 Pablo Farias Navarro 开发制作的。虽然标题看着是移动游戏,但实际是关于 JavaScript 和 Phaser 的。JavaScript 和 Phaser 移动应用开发已经转移到 PhoneGap 话题去了。

3、 Pygame 无依赖要求

由于 Python Wheels 的出现,Pygame 超级容易安装。在 Fedora/Red Hat 系统下也可使用 yum 包管理器来安装:

sudo yum install python3-pygame

更多信息请参考官网 Pygame 安装说明文档

相比来说,虽然 Phaser 本身更容易安装,但需要掌握更多的知识。前面提到的,学生需要在 HTML 文档中组装他们的 JavaScript 代码,同时还需要些 CSS。除了这三种语言(HTML、CSS、JavaScript),还需要使用火狐或谷歌开发工具和编辑器。JavaScript 最常用的编辑器有 Sublime、Atom、VS Code(按使用多少排序)等。

由于浏览器同源策略的原因,如果您直接在浏览器中打开 HTML 文件的话,Phaser 应用是不会运行的。您必须运行 Web 服务,并通过服务访问这些文件。还好,对于大多数工程项目,可以不用在本地运行 Apache 服务,只需要运行一些轻量级的服务就可以,比如 httpster

Phaser 和 JavaScript 的优势

JavaScript 和 Phaser 有着种种的不好,为什么我还继续教授他们?老实说,我考虑了很长一段时间,我在担心着学生学习 变量申明提升 variable hoisting 和变量作用域的揪心。我开发出基于 Pygame 和 Python 的课程,随后也开发出一涛基于 Phaser 的。最终,我决定使用 Pablo 预先制定的课程作为起点。

我转用 JavaScript 有两个原因。首先,JavaScript 已经成为正式应用的正式语言。除了 Web 应用外,也可使用于移动和服务应用方面。JavaScript 无处不在,其广泛应用于孩子们每天都能看到的应用中。如果他们的朋友使用 Javascript 来编程,他们很可能也会受影响而使用之。正如我看到了 JavaScript 背后的动力,所以深入研究了可编译成 JavaScript 的替代语言,主要是 Dart 和 TypeScript 两种。虽然我不介意额外的转换步骤,但还是最喜欢 JavaScript。

最后,我选择使用 Phaser 和 JavaScript 的组合,是因为我意识到上面那些问题在 JavaScript 可以被解决,仅仅只是一些工作量而已。高质量的调试工具和一些大牛们的工作使得 JavaScript 成为教育孩子编码的可用和有用的语言。

最后话题: Python 对垒 JavaScript

当家长问我使用的什么语言作为孩子的入门语言时,我会立即推荐 Python 和 Pygame。因为有成千上万的课程可选,而且大多数都是免费的。我为我的儿子选择了 Al Sweigart 的 使用 Python 和 Pygame 开发游戏 课程,同时也在使用 Allen B. Downey 的 Python 编程思想:如何像计算机科学家一样思考。在 Android 手机上可以使用 Tom RothamePAPT Pyame 来安装 Pygame 游戏。

尽管有我的建议, 我总是怀疑孩子们很快就会搬到 JavaScript。这没关系 —— JavaScript 是一门成熟的编程语言,有很多很多辅助工具。但有多年的帮助大儿子使用 Python 创建炫酷游戏经历的我,依然钟情于 Python 和 Pygame。

关于作者

Craig Oda —— 东京 Linux 用户组的首位总裁和共同创始人,奥莱理日本出版的《Linux 日文环境》的共同作者。在亚洲建立了第一个 ISP 的核心团队成员之一。一个大型 Linux 公司的产品管理及市场的前任副总裁。硅谷开发者关系咨询公司 Oppkey 的合作方。更多


via: https://opensource.com/article/17/11/pygame

作者:Craig Oda 译者:runningwater 校对:wxy

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

如何在 Linux 或类 Unix 操作系统上的 bash shell 中打开或关闭文件名称颜色(ls 命令颜色)?

大多数现代 Linux 发行版和 Unix 系统都有一个定义了文件名称颜色的别名。然后,ls 命令负责在屏幕上显示文件、目录和其他文件系统对象的颜色。

默认情况下,文件类型不会用颜色区分。你需要在 Linux 上将 --color 选项传递给 ls 命令。如果你正在使用基于 OS X 或 BSD 的系统,请将 -G 选项传递给 ls 命令。打开或关闭颜色的语法如下。

如何关闭 ls 命令的颜色

输入以下命令:

$ ls --color=none

或者用 unalias 命令删除别名:

$ unalias ls

请注意,下面的 bash shell 别名被定义为用 ls 命令显示颜色。这个组合使用 alias 命令grep 命令

$ alias | grep ls

示例输出:

alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'

如何打开 ls 命令的颜色

使用以下任何一个命令:

$ ls --color=auto
$ ls --color=tty

如果你想要的话,可以定义 bash shell 别名

alias ls='ls --color=auto'

你可以在 ~/.bash_profile~/.bashrc 文件 中添加或删除 ls 别名 。使用文本编辑器(如 vi)编辑文件:

$ vi ~/.bashrc

追加下面的代码:

# my ls command aliases #
alias ls = 'ls --color=auto'

在 Vi/Vim 文本编辑器中保存并关闭文件即可

关于 *BSD/macOS/Apple OS X 中 ls 命令的注意点

-G 选项传递给 ls 命令以在 {Free、Net、Open} BSD 或 macOS 和 Apple OS X Unix 操作系统家族上启用彩色输出:

$ ls -G

示例输出:

How to enable colorized output for the ls command in Mac OS X Terminal

如何在 Mac OS X 终端中为 ls 命令启用彩色输出

如何临时跳过 ls 命令彩色输出?

你可以使用以下任何一种语法暂时禁用 bash shell 别名

\ls
/bin/ls
command ls
'ls'

关于作者

作者是 nixCraft 的创建者,经验丰富的系统管理员,也是 Linux 操作系统/Unix shell 脚本的培训师。他曾与全球客户以及IT、教育、国防和太空研究以及非营利部门等多个行业合作。在 TwitterFacebookGoogle + 上关注他。


via: https://www.cyberciti.biz/faq/how-to-turn-on-or-off-colors-in-bash/

作者:Vivek Gite 译者:geekpi 校对:wxy

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