如何在Linux中限制用户命令[关闭]

2024-02-06

我在一个组中有一个用户:“demo”。

我想设置该用户只能运行 10 个命令的策略,例如vim, nano, cd, etc.

或者,将策略设置为有权访问除ssh and cat命令。


有很多不同的方法可以实现这一目标。我将列出几种可能的解决方案之一。

我建议使用几个不同的保护层来防止用户运行他们不应该被允许访问的命令。这里的所有说明都假设用户有自己的/home/[username]目录,他们的 shell 是/bin/bash,并且您希望他们在登录系统时使用 bash shell。

  1. 将用户的 bash 更改为受限 bash 模式,以便他们无法更改目录(如果您的系统上没有受限制的 bash 模式,这个链接 http://www.gnu.org/software/bash/manual/html_node/The-Restricted-Shell.html将为您提供帮助并提供更多信息)chsh -s /bin/rbash [username]

  2. 更改目录权限,以便只有用户可以编辑其主目录的内容

chmod 755 /home/[username]

  1. 删除用户的.bashrc file

rm /home/[username]/.bashrc 这个网站 http://www.joshstaiger.org/archives/2005/07/bash_profile_vs.html有更多信息说明为什么删除该文件可能是一个好主意.bashrc在这个情况下。

  1. 创建一个.bash_profile并为您要禁用的所有命令添加“安全”别名

./bash_profile 文件示例

alias apt-get="printf ''"  
alias aptitude="printf ''"  
[...]  
alias vi="vi -Z" #this is vi's safe mode and shell commands won't be run from within vi
alias alias="printf ''"  

请检查bash 命令的完整列表 http://ss64.com/bash/了解更多信息。您必须确保alias alias="printf ''"command 是列表中的最后一个命令,否则您将无法为所有这些命令添加别名。

Note运行下面的命令将搜索系统上几乎所有可用的命令,并输出一个现成的文件,其中几乎所有可用的命令都已预先别名。这[命令是test command在bash中。因此,如果您在文件中看到这一点,则这不是错误。

#search /bin and /usr/bin for any commands that exist on our system
ls /bin -1 > commands_on_system.txt && ls /usr/bin -1 >> commands_on_system.txt

#format and save this information to a bash variable
IFS=$'\n' GLOBIGNORE='*' command eval  'COMMANDS_ON_SYSTEM=($(cat ./commands_on_system.txt))'
IFS=$'\n' COMMANDS_ON_SYSTEM=($(sort <<<"${COMMANDS_ON_SYSTEM[*]}"))
unset IFS

#save these commands in aliased format for easy usage
for linux_command in "${COMMANDS_ON_SYSTEM[@]}"
do :
   #you can change how this works to automatically
   #setup the command file for you 
   echo "alias ${linux_command}=\"printf ''\"" >> ./startup_functions_for_beginners.sh
done
  1. 通过将 vi 命令别名为受限模式来禁用 vi 中的 shell 命令
    语法是alias vi="vi -Z",但是请看这个网站 http://vimdoc.sourceforge.net/htmldoc/starting.html#-Z了解更多信息。

  2. 更改用户的所有权.bash_profile to root
    chown root:root /home/[username]/.bash_profile

  3. 最后,删除用户的写入权限.bash_profile
    chmod 755 /home/[username/.bash_profile]

现在,当用户登录时,他们将无法更改目录,您不希望他们使用的所有命令将输出相同的信息,就像用户按下[ENTER]没有指定命令的键,以及您的/bin/bash功能保持完好。

根据您选择以这种方式别名或不以这种方式别名的功能,用户仍然可以绕过您实现的某些控件。然而,由于我们实现了一些安全缓冲区,因此用户确实必须了解计算机系统才能执行任何危险操作。

在相关说明和您可能需要考虑的事情上,如果您直接将这些别名放入每个用户的.bash_profile您将很难维护哪些函数应该使用别名,哪些函数不应该使用别名,并且如果您需要更改任何内容的别名,则必须单独更改所有函数。另外,由于用户可以使用vim or vi要查看文件,他们可以看到其内容.bash_profile并了解他们有哪些限制和没有哪些限制。

为了解决这个问题,我建议。

  1. 将所有别名放在用户无法访问的目录中(粘贴.bash_profile here)

/[path_to_file]/startup_functions_for_beginners.sh

  1. 将别名纳入他们的.bash_profile

改进的 ./bash_profile 文件示例

if [[ -f /[path_to_file]/startup_functions_for_beginners.sh ]]; then
    . /[path_to_file]/startup_functions_for_beginners.sh
fi

这应该会让您上路,但请记住,几乎总有办法规避限制。

另外,请随意重新组合此答案中的信息以满足您的需求。这些绝对可以与许多其他限制结合起来。

问:我需要用户有权访问fg and bg,但我不希望他们能够访问aptitude or bash

alias apt-get="printf ''"  #the user won't be able to run this  
alias aptitude="printf ''"  #the user won't be able to run this  
alias bash="printf ''"  #the user won't be able to run this  
#alias fg="printf ''" #this will run as a bash built-in  
#alias bg="printf ''" #you actually don't need to include these in your script  

常用命令列表如下哈佛网站 http://www.math.harvard.edu/computing/unix/unixcommands.html(并非详尽无遗)

当您将程序安装到 Linux 时,您可用的内容会发生变化。我建议您运行上面步骤 4 中列出的命令,以帮助在安装新命令后查找它们。

使用编辑器时应小心,因为有些编辑器允许从程序内执行 shell 命令

nano
emacs
pico
sed
vi
vim  

其他一切

exit
logout
passwd
rlogin
ssh
slogin
yppasswd
mail
mesg
pine
talk
write
as
awk
bc
cc
csh
dbx
f77
gdb
gprof
kill
ld
lex
lint
make
maple
math
nice
nohup
pc
perl
prof
python
sh
yacc
xcalc
apropos
find
info
man
whatis
whereis
cd
chmod
chown
chgrp
cmp
comm
cp
crypt
diff
file
grep
gzip
ln
ls
lsof
mkdir
mv
pwd
quota
rm
rmdir
stat
sync
sort
tar
tee
tr
umask
uncompress
uniq
wc
cat
fold
head
lpq
lpr
lprm
more
less
page
pr
tail
zcat
xv
gv
xpdf
ftp
rsync
scp
alias
chquota
chsh
clear
echo
pbm
popd
pushd
script
setenv
stty
netstat
rsh
ssh
bg
fg
jobs
^y
^z
clock
date
df
du
env
finger
history
last
lpq
manpath
printenv
ps
pwd
set
spend
stty
time
top
uptime
w
who
whois
whoami
gimp
xfig
xv
xvscan
xpaint
kpaint
mplayer
realplay
timidity
xmms
abiword
addbib
col
diction
diffmk
dvips
explain
grap
hyphen
ispell
latex
pdfelatex
latex2html
lookbib
macref
ndx
neqn
nroff
pic
psdit
ptx
refer
roffbib
sortbib
spell
ispell
style
tbl
tex
tpic
wget
grabmode
import
xdpyinfo
xkill
xlock
xterm
xwininfo
html2ps
latex2html
lynx
netscape
sitecopy
weblint
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Linux中限制用户命令[关闭] 的相关文章

  • InstaPy:“错误,无法确定 64 位 Linux 的正确文件名”

    有人知道如何解决或解决这个问题吗 来自控制台的堆栈跟踪 执行后报告错误 InstaPy Version 0 6 9 Workspace in use home zanettra InstaPy Error unable to determi
  • 如何替换“docker run”命令中的变量值

    我正在使用 bash 脚本并尝试分配指纹值 如下所示 export FINGERPRINT D0 19 C5 80 42 66 56 AC 6F docker run rm i v var run docker sock var run d
  • 如何剪切(1) 个驼峰字?

    Bash 中有没有一种简单的方法可以将驼峰式单词拆分为其组成词 例如 我想将 aCertainCamelCasedWord 拆分为 a certain Camel Cased Word 并能够选择我感兴趣的那些字段 当单词分隔符是下划线时
  • 为 Qt 应用程序创建 Linux 安装

    我刚刚用 Qt Creator 制作了一个很棒的程序 我对自己很满意 如何将其从台式机移至笔记本电脑 那么 最好的方法是安装程序 对吗 对于 Ubuntu 这是一个 Debian 软件包 对吗 我怎么做 有人这样做过吗 他们可以分享 QT
  • 如何不断刷新屏幕并实时更新[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想在linux上写一个C程序 不断刷新屏幕并实时更新 例如类似于top终端中的命令 谁能指出我正确的方向 为了保持它跨终端类型的可移
  • 如何在Python中独立于语言安装(linux)获取用户桌面路径

    我找到了 如何找到用户桌面的路径 的几个问题和答案 但在我看来它们都已失效 至少我找到的那些 原因是 如果用户安装的 Linux 不是英语 他或她的桌面很可能位于除 Desktop 例如 对于瑞典语 我相信它是在 Skrivbord 谁知道
  • Linux shell 脚本:十六进制数字到二进制字符串

    我正在 shell 脚本中寻找一些简单的方法来将十六进制数字转换为 0 和 1 字符的序列 Example 5F gt 01011111 是否有任何命令或简单的方法来完成它 或者我应该为其编写一些开关 echo ibase 16 obase
  • 未找到命令“ember”

    看来我搞砸了 ember cli 安装 我已经使用 sudo 安装了 npm 但是在阅读了 npm 上 ember cli 和 sudo 的一些问题后 我按照此处的说明卸载并重新安装https gist github com isaacs
  • 适用于 KDE 和 Gnome 的 Gui [重复]

    这个问题在这里已经有答案了 我想为一个现在是 CLI 的应用程序编写一个 gui 它需要在 KDE 和 Gnome DE 中 看起来不错 充分利用用户的外观设置 如果我选择 Qt 或 GTK 我能够做到这一点吗 它们与两个 DE 集成良好吗
  • 文本处理问题:删除其中一列不包含特定值的行

    我有一个制表符分隔的文件 如下所示 input sequence match sequence score receptor group epitope antigen organism ASRPPGGVNEQF ASRPPGGVNEQF
  • 如何将参数传递给java bash脚本? [复制]

    这个问题在这里已经有答案了 我有一个简单的 bash 脚本来运行我的 java 程序 就这个 run sh bin sh java jar target my jar arch jar 我想将参数传递给这个脚本 该脚本必须将它们传递给jav
  • Linux 桌面快捷方式和安装图标

    我需要添加什么到我的 spec文件来创建桌面快捷方式并在安装过程中为快捷方式分配一个图标 rpm 如果需要脚本 一个示例将非常有帮助 您在 Linux 下使用 desktop 文件作为图标 图标放置的位置取决于您使用的发行版和桌面环境 由于
  • Linux shell 脚本中的 while 循环超时

    这工作正常 无限循环 while TRUE do printf done 我在尝试着timeout this while loop与timeout命令 所有这些都不起作用 timeout 5 while TRUE do printf don
  • 归档文件系统或格式

    我正在寻找一种文件类型来存储已退役系统的档案 目前 我们主要使用 tar gz 但从 200GB tar gz 存档中查找并提取几个文件是很麻烦的 因为 tar gz 不支持任何类型的随机访问读取规定 在你明白之前 使用 FUSE 安装 t
  • 在 Fish Shell 中设置导出

    我安装了多个版本的 PHP 对于我的正常开发 我总是使用通过自制程序安装的 PHP 5 5 x 在鱼壳里 which php php version gt usr local bin php gt PHP 5 5 8 cli built J
  • 在 /dev/input/eventX 中写入事件需要哪些命令?

    我正在开发一个android需要将触摸事件发送到 dev input eventX 的应用程序 我知道C执行此类操作的代码结构如下 struct input event struct timeval time unsigned short
  • 在主目录中安装库

    在 Linux Ubuntu 中 我尝试运行一个工具 但它显示错误 库丢失 我无权在系统中安装任何内容 或者根本无法从我的用户帐户执行 sudo 是否可以在我的主目录 没有 sudo 中安装缺少的库 在我的例子中为 libstdc so 6
  • 如何在 sed 中转义方括号[重复]

    这个问题在这里已经有答案了 我正在使用 grep 和 sed 解析遗留的 C 代码 当尝试替换方括号时 发生了一些奇怪的事情 以下代码替换方括号效果很好 echo xyx xzx xyx sed s g 结果是 xyx xzx xyx 当我
  • 信号处理程序有单独的堆栈吗?

    信号处理程序是否有单独的堆栈 就像每个线程都有单独的堆栈一样 这是在 Linux C 环境中 来自 Linux 手册页signal 7 http kernel org doc man pages online pages man7 sign
  • powershell stdin 管道和重定向

    你好 我一直在制作一个小的跨平台脚 本 我可以将其卷曲并通过管道传输到bash和Powershell中 基本思想是服务器向解释器发送一个命令 然后它给出一个命令将所有输出重定向到标准输出 bash 中的一个例子是 some commands

随机推荐

  • Python 的环境路径不起作用?

    我已在新 PC 上安装了 Python 3 4 Python 可以工作 但我正在尝试让 pip 来解决这个问题 我已经为 Python 创建了一条路径 如下所示 C Python34 python exe 当我运行下面的代码时 C Wind
  • 由于 node-gyp 无法安装 npm:找不到 binding.gyp

    我一整天都在研究这个问题 并尝试了很多不同的事情 卸载节点并安装最新版本 使用 msvs version 标志设置为2010 2011 2012 2013 2015 删除 node gyp 文件夹 将 python 路径添加到 npmrc
  • 在 Python 中使用 Mechanize 获取和捕获 HTTP 响应

    我正在尝试从 python 中的 Mechanize 获取响应代码 虽然我能够获得 200 状态代码 但其他任何内容都不会返回 404 抛出和异常 30x 被忽略 有没有办法获取原始状态码 Thanks 错误会抛出异常 因此只需使用 try
  • 数据类型 date 的日期函数 dateadd 不支持日期部分小时

    当我在 jasper 报告中运行以下查询时 出现异常 net sf jasperreports engine JRException 执行 SQL 语句时出错 Activity Summary Activity Summery Report
  • Ruby on Rails - 数组哈希、多列分组和求和

    我对这个主题有类似的问题Ruby on Rails 数组哈希 按列名分组和求和 https stackoverflow com questions 8500280 ruby on rails hash of arrays group by
  • 具有自动调整单元格大小的 UICollectionView 错误地定位了补充视图

    我正在使用带有流布局的 UICollectionView 并尝试让 collectionView 根据 AutoLayout 约束适当调整单元格的大小 虽然单元格按预期工作 但我添加到 CollectionView 的任何补充视图的布局都遇
  • alpine linux 上的程序段错误。我该如何解决?

    我一直在用 C C 开发 webrtc 数据通道库写了一个程序 https github com hamon in librtcdcpp blob alpine test examples websocket client 2in1 c在
  • Java 7 中是否会包含结构和值类型(如 C# 的)?

    Java 7 中是否会包含结构和值类型 如 C 的 这是 John Rose Oracle JVM 开发人员 关于此提案的博客文章 它已经存在了一段时间 但还没有作为官方 JSR 即使在 java 9 中 这似乎也不太可能发生 http b
  • R 中两个列表的元素组合

    假设我有两个列表 list a lt as list c a b c list b lt as list c d e f 我想递归地组合这些列表 这样结果将是作为向量的组合元素列表 如下所示 1 1 a d 2 1 a e 3 1 a f
  • 从字典中查找单词字谜的最佳算法[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我遇到了这样的问题 我有一个列表 它是包含数百万个单词的字典 我输入一个像 OSPT 这样的单词 只有 2 个单词可以组成 STOP 和
  • 从一个表中选择并插入到另一个表中

    我有两张桌子 Table A nid vid 类型 标题 uid Table B id 问题文本 我需要将 Table B 中的记录插入到 Table A 中 我试过这个 INSERT INTO Table A nid vid type t
  • 如何找到原名称已知的重命名文件的新路径?

    考虑以下用例 我正在本地分支上工作 同时在主分支上完成了重构 现在 一些文件 类 已被重命名和 或移动到新位置 合并时 由于缺少类 我收到很多很多导入错误 A B C D E master F G H I J topic In A有我用过的
  • 带箭头键(下一个和后退)的键盘导航用于更改文件名

    我有一堆具有不同文件名的 html 文件 我需要添加一个选项以使用键盘箭头键进行导航 上一个和下一个文件 文件名不是动态的 例如 filename html anotherfile html thirdone html ETC 所以我需要
  • 通过索引检索 JSON 对象的属性?

    假设这个 JSON 对象 var obj set1 1 2 3 set2 4 5 6 7 8 set3 9 10 11 12 set2 属性可以像这样检索 obj set2 有没有办法通过索引检索 set2 属性 它是 JSON 对象的第二
  • 将日期时间转换为毫秒 - C++ - 跨平台

    我想将 20160907 05 00 54 123 格式的字符串转换为毫秒 我知道strptime在 Windows 中不可用 我想在 Windows 和 Linux 中运行我的程序 我也无法使用第三方库 我可以标记字符串并转换它 但是有没
  • 动态规划-硬币变化决策

    我正在复习算法课程中的一些旧笔记 动态规划问题对我来说似乎有点棘手 我遇到一个问题 我们有无限供应的硬币 其中一些面额为 x1 x2 xn 并且我们想要对某个值 X 进行找零 我们正在尝试设计一个动态程序来决定 X 的找零是否可以是否制造
  • Vimdiff 失败并显示“无法读取或写入临时文件”

    我在 Windows 7 上使用 Vim 7 4 我确实有一个自定义 vimrc 文件 但 Vim 和 gVim 都工作正常 当我尝试跑步时vimdiff xxxxx yyyyy 它给出了错误 无法读取或写入临时文件 此问题可能是由 Win
  • PartCover 4.0 仅报告 NUnit 库

    我正在使用 PartCover 4 0 来自Sourceforge 页面 http sourceforge net projects partcover files 最新开发版本 在 Windows 7 x64 上使用 NUnit 2 5
  • javascript滚动到div类的底部

    您好 我正在尝试在 django 中实现一个简单的聊天框 并且想知道如何使用 javascript 滚动到 div 类的底部 基本上 当页面加载时 我希望用户可以看到发送给他们的最新消息而不是最近的消息 我最近不得不做类似的事情 我发现了一
  • 如何在Linux中限制用户命令[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在一个组中有一个用户 demo 我想设置该用户只能运行 10 个命令的策略 例如vim nano cd etc 或者 将策略设置为有权访