Questions tagged «shell»

Shell是Unix的命令行界面。您可以交互地在外壳程序中键入命令,也可以编写脚本来自动执行任务。使用此标记可解决适用于/ bin / sh和大多数兼容shell(ash,bash,ksh,zsh等)的问题。对于有错误的Shell脚本,请在此处发布之前在http://shellcheck.net中对其进行检查。

8
/ usr / sbin / nologin作为登录shell是否出于安全目的?
在我的/etc/passwd文件中,我可以看到www-dataApache所使用的用户以及各种系统用户都具有/usr/sbin/nologin或/bin/false作为其登录外壳。例如,以下是几行: 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 games:x:5:60:games:/usr/games:/usr/sbin/nologin www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin syslog:x:101:104::/home/syslog:/bin/false whoopsie:x:109:116::/nonexistent:/bin/false mark:x:1000:1000:mark,,,:/home/mark:/bin/bash 因此,如果我尝试交换这些用户中的任何一个(有时我想检查我对他们的权限的了解,并且可能还有其他至少至少一半的理智的原因),则我将失败: mark@lunchbox:~$ sudo su www-data This account is currently not available. mark@lunchbox:~$ sudo su syslog mark@lunchbox:~$ 当然,这不算什么麻烦,因为我仍然可以通过这样的方法为他们启动外壳程序: mark@lunchbox:~$ sudo -u www-data /bin/bash www-data@lunchbox:~$ 但这让我想知道拒绝这些用户的登录外壳将达到什么目的。环顾互联网进行解释,许多人声称这与安全性有关,并且每个人似乎都同意更改这些用户的登录外壳在某种程度上是个坏主意。这是引号的集合: 将Apache用户的shell设置为非交互式通常是一种很好的安全做法(实际上,所有不必交互式登录的服务用户都应将其shell设置为非交互式)。 - https://serverfault.com/a/559315/147556 用户www-data的shell设置为/ usr / sbin / nologin,这是有充分理由的。 - https://askubuntu.com/a/486661/119754 [系统帐户] 可能是安全漏洞,尤其是在启用了外壳程序的情况下: 坏 bin:x:1:1:bin:/bin:/bin/sh 好 bin:x:1:1:bin:/bin:/sbin/nologin …
76 shell  security  users  login 


7
如何在别名命令上使用“哪个”?
像大多数用户一样,我设置了一堆别名来为常用程序提供默认的标志集。例如, alias vim='vim -X' alias grep='grep -E' alias ls='ls -G' 问题是,如果我想使用which上看到我的vim/ grep/ ls/等从,别名的方式来获得: $ which vim vim: aliased to vim -X 这是有用的输出,但是在这种情况下不是我想要的;我知道vim是别名,vim -X但我想知道它 vim的来源。 除了临时取消定义别名(以便我可以which在上面使用)之外,是否有一种简单的方法来which“解开”别名并在其上运行? 编辑:似乎which是一个shell内置的,在不同的shell上具有不同的行为。在Bash中,SiegeX对--skip-alias旗帜的建议起作用了。但是,我在Zsh上。那里是否存在类似的东西?
76 shell  zsh  alias  which 



7
什么时候使用附加的文件描述符?
我知道您可以创建文件描述符并将输出重定向到它。例如 exec 3<> /tmp/foo # open fd 3. echo a >&3 # write to it exec 3>&- # close fd 3. 但是您可以在没有文件描述符的情况下执行相同的操作: FILE=/tmp/foo echo a > "$FILE" 我正在寻找一个很好的示例,说明何时需要使用附加的文件描述符。

6
Shell中的命令前的点是什么意思?
在遵循android eclipse调试教程时,我遇到以下命令。 cd /path/to/android/root . build/envsetup.sh lunch 1 make emulator 我的问题是前面的点是什么build/envsetup.sh意思?
74 shell 

7
我有多少深弹?
问题:查找我有多少壳深。 详细信息:我从vim打开了很多外壳。构建并运行并退出。有时我忘记了,打开另一个Vim,然后打开另一个shell。:( 我想知道我有多少深的贝壳,也许一直都在我的贝壳屏幕上。(我可以管理这部分)。 我的解决方案:解析进程树并查找vim和bash / zsh并找出其中的当前进程深度。 这样的东西已经存在了吗?我什么都找不到。
73 bash  shell-script  shell  vim  zsh 




3
如何测试Shell脚本的POSIX兼容性?
考虑到POSIX是所有unice中最通用的标准,我很想知道是否有专门支持它的shell。尽管大多数现代Shell提供对POSIX的支持(并且可以毫无问题地运行POSIX兼容脚本),但它们在指出不兼容功能方面表现不佳。 是否有仅实现POSIX和POSIX的外壳,以至于它会为任何不兼容的功能抛出错误? 编辑我想澄清的是,我并不是在寻求有关编写可移植Shell脚本的一般提示。评论中提到的相关问题已经解决了这一问题。当我发现bash有一个--posix选择但只发现它只影响某些初始化行为时,我想到了这个问题,而这并不是我要寻找的。

4
内置命令与非内置命令有什么区别?
内置命令和另一个名义上可以做相同事情的命令之间有本质上的区别吗? 例如。内建函数是否获得“特殊”待遇?...运行它们的开销较少吗?..或者它们只是简单地“内置”;像您的汽车仪表板? ...并且这些内置函数有明确的列表(当前列表)吗?

8
$ *和$ @有什么区别?
考虑以下代码: foo () { echo $* } bar () { echo $@ } foo 1 2 3 4 bar 1 2 3 4 它输出: 1 2 3 4 1 2 3 4 我正在使用Ksh88,但是我也对其他常见的shell感兴趣。如果您碰巧知道特定外壳的任何特殊性,请提及它们。 我在Solaris的Ksh手册页中发现了以下问题: $ *和$ @的含义在不加引号或用作参数分配值或文件名时相同。但是,当用作命令参数时,$ *等效于``$ 1d $ 2d ...'',其中d是IFS变量的第一个字符,而$ @等效于$ 1 $ 2 .... 我尝试修改IFS变量,但没有修改输出。也许我做错了什么?
72 shell  quoting  ksh  arguments 

4
了解IFS
该站点和StackOverflow上的以下几个线程有助于理解其IFS工作原理: 在for循环中IFS是什么? 如何遍历文件行 Bash,使用IFS从文件逐行读取 但是我还有一些简短的问题。我决定在同一篇文章中问他们,因为我认为这可能会对将来的读者有所帮助: Q1。 IFS通常在“场分割”的上下文中讨论“场”。是场分裂一样的分词? Q2: POSIX规范说: 如果IFS的值为空,则不执行任何字段拆分。 设置IFS=是否与设置IFS为null 相同?这是将它设置为empty string太高的意思吗? Q3:在POSIX规范中,我阅读以下内容: 如果未设置IFS,则外壳的行为应类似于IFS的值为 <space>, <tab> and <newline> 说我要还原默认值IFS。我怎么做?(更具体地说,我该如何指代<tab>和<newline>?) Q4:最后,此代码将如何: while IFS= read -r line do echo $line done < /path_to_text_file 如果我们将第一行更改为 while read -r line # Use the default IFS value 或者: while IFS=' ' read -r line
71 shell 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.