登录时以root用户身份运行脚本(无sudoer用户,shell会话)


8

非常类似于/etc/profile和,~/.profile但它是由root运行的,而不是由用户执行登录。/etc/rc.local在引导后运行,但是我需要在登录之前运行脚本。该用户不是一个轻浮的人。

谢谢!


可能有一种方法可以执行此操作,但是可能不一样,/etc/profile或者~/.profile因为在这些脚本中运行代码是由用户的外壳程序完成的,并且受用户控制,而如果您不希望用户拥有用户可以root自行运行程序,那么必须由用户进程外部的某些运行服务来完成。...如果您可以告诉我们您要运行的脚本的目的,可能会有所帮助。
伊利亚·卡根

我需要为一个特定用户执行一个特定(--bind)挂载。我已经尝试过使用所有者和用户选项的fstab,但是它不起作用。/etc/rc.local是一个选项,但是无论用户是否登录,它总是执行挂载。我目前已向用户授予了“挂载”的sudoer特权,但这是一种解决方法,不喜欢向标准用户授予任何特权。我想我会改用rc.local。谢谢!
AntonioSánchez

您可以仅使用该特定mount命令创建一个根脚本,并向用户授予仅运行该脚本的特权(配置/etc/sudoers)。具有给定选项的命令可以直接在中设置sudoers
enzotib

我已经尝试过这种方式。问题是,当需要在脚本中运行“ mount”时,再次必须执行“ sudo”,因为脚本是由“ user”而不是“ root”运行的,所以最终还是要“ mount”必须也授予“用户”,现在我有两个,而不仅仅是一个唯一的sudoers规则。这是我的经验,所以请记住,我不是专家,也许我做错了什么。谢谢!
AntonioSánchez

Answers:


3

只是回到sudoers方法,我想您几乎就已经放弃了。查看您的最新评论,我想解决一些可能会为您解决的问题:

如果您以root用户身份运行脚本,则无需从脚本内部调用sudo。

我有一个像这样的脚本:

#! /bin/bash

echo $USER
whoami

如果我跑步,sudo ./myscript我会看到root两者的回报。脚本在其中运行的会话是根外壳。

简而言之,这意味着您在脚本中执行的所有操作均已具有root权限。您不需要呼叫sudo(不是那样会很麻烦- root通常具有sudo权限)。

所以写脚本,chownrootchmod700(所以只有root可以运行,读取或编辑),然后就允许用户[S]通过sudoers文件运行它。那应该工作。

如果它不起作用,则可能是脚本的问题更大,而不是权限框架的问题。我建议给予用户完全sudo访问权限(添加到管理组是最简单的方法),然后运行脚本。


2

步骤1.使用任何编辑器使用bind命令创建脚本。例如:

sudo emacs bind_user_directories.sh

内容:

#!/bin/bash

#NOTE: this file would be placed in /usr/local/sbin/ folder as bind_user_directories.sh
#alternatively it could be placed in /etc/init.d/ ... (I guess)

### BEGIN INIT INFO
# Provides:          bind_user_directories
# Required-Start:    
# Required-Stop:     
# Should-Start:      $named
# Default-Start:     0 2 3 4 5 6 (I guess...)
# Default-Stop:      1
# Short-Description: mount --bind for a user
# Description:       runs mount --bind command for certain pre-defined directories for a specific user
### END INIT INFO

# What is this?
DESC="bind_user_directories"

# See how we were called.
case "$1" in

    start)
        log_progress_msg "bind directories for user..."
        sudo mount --bind /source/path /target/path
        log_progress_msg "done: bind directories for user"
        ;;

    stop)
        log_progress_msg "umount --bind directories for user..."
        sudo umount /target/path
        log_progress_msg "done: unbind directories for user"
        ;;

    restart)
        $0 stop
        sleep 1
        $0 start
        ;;

    *)
        #log_success_msg "Usage: bind_user_directories {start|stop|restart}"
        log_success_msg "Usage: service bind_user_directories <start|stop|restart>"
        exit 1
        ;;
esac

exit 0

步骤2.保存bind_user_directories.sh并使其可执行:

chmod a+x bind_user_directories.sh

步骤3.将其链接到合适的位置,例如/ usr / local / sbin:

sudo ln -s bind_user_directories.sh /usr/local/sbin/bind_user_directories.sh

步骤4.创建新贵脚本:

sudo emacs /etc/init/bind_user_directories.conf

内容:

description "runs mount --bind command for certain pre-defined directories for a specific user"

start on filesystem and net-device-up IFACE!=lo

stop on runlevel [!023456]
console output
respawn
respawn limit 10 5

exec /usr/local/sbin/bind_user_directories.sh start

如果这对您有用,请告诉我。登录后,您可以检查系统日志中是否有消息。(我尚未对其进行测试,并且之前从未实现过类似的操作。)如果您对解决方案有所改进,请在此处分享您的最终解决方案。谢谢。


是的,它有效!它是Ubuntu世界中mdms /etc/mdm/PostLogin/脚本的绝佳替代品!
亚当·里奇科夫斯基

您在systemd中有任何类似的解决方案吗?askubuntu.com/questions/847930/...
亚当·赖采科斯基

0

在登录前以root身份运行脚本

  1. 您可以使用Upstart启动脚本

  2. 您可以将脚本调用添加到现有的kdm / gdm / etc启动脚本中

示例:主题:常见问题解答:自动启动/自动运行,定期运行


但是AntonioSánchez寻找的是如何使脚本root 在特定用户登录时运行
伊利亚·卡根

该脚本必须独立运行,会话是图形外壳或标准外壳。我已经更新标题以说明这一点。我已经阅读了有关Upstart的内容,但是对于(显然)简单的任务而言,它看起来很复杂。无论如何,到目前为止,Upstart似乎是唯一的方法。如果您知道Upstart,那么很难学习足够的知识来完成这项工作吗?谢谢!
AntonioSánchez
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.