- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要以不同的用户身份执行 bash 脚本的一部分,并在该用户的 $HOME
中执行目录。但是,我不确定如何确定这个变量。切换到该用户并拨打 $HOME
没有提供正确的位置:
# running script as root, but switching to a different user...
su - $different_user
echo $HOME
# returns /root/ but should be /home/myuser
$different_user=deploy
# create user
useradd -m -s /bin/bash $different_user
echo "Current user: `whoami`"
# Current user: root
echo "Switching user to $different_user"
# Switching user to deploy
su - $different_user
echo "Current user: `whoami`"
# Current user: root
echo "Current user: `id`"
# Current user: uid=0(root) gid=0(root) groups=0(root)
sudo su $different_user
# Current user: root
# Current user: uid=0(root) gid=0(root) groups=0(root)
最佳答案
更新 : 看这个问题的题目,好像有人来过只是想寻找一种方法来查找不同用户的主目录,而无需模拟该用户 .
在这种情况下,最简单的解决方案是使用 tilde expansion与感兴趣的用户名,结合 eval
(这是必需的,因为用户名必须作为不带引号的文字给出,以便波浪号扩展工作):
eval echo "~$different_user" # prints $different_user's home dir.
注意:
平常 caveats regarding the use of eval
申请 ;在这种情况下,假设您控制了
$different_user
的值并且知道它只是一个用户名。
sudoers
获得授权)文件可以通过 sudo
冒充其他用户. sudo
的默认配置- 更改其配置可以使其行为不同 - 参见 man sudoers
. sudo -H -u someUser someExe [arg1 ...]
# Example:
sudo -H -u root env # print the root user's environment
笔记:
-H
,模拟进程(在指定用户的上下文中调用的进程)将在$HOME
中报告原始用户的主目录。 . someExe
恰好是 shell ) - 调用 shell 的扩展 - 在传递给模拟进程之前 - 显然仍然会发生。 someExe
要么与
-i
或
-s
- 未指定
someExe ...
创建一个
互动 shell :
-i
创建一个 登录 shell someUser
,这意味着以下内容:someUser
的用户特定的 shell 配置文件(如果已定义)将被加载。 $HOME
指向 someUser
的主目录,所以有 不需要 -H
(尽管您仍然可以指定它)someUser
的主目录。 -s
创建一个非登录shell:~/.bashrc
)-H
,模拟进程会在$HOME
中报告原始用户的主目录。 . # Run root's shell profile, change to root's home dir.
sudo -u root -i eval 'echo $SHELL - $USER - $HOME - $PWD'
# Don't run root's shell profile, use current working dir.
# Note the required -H to define $HOME as root`s home dir.
sudo -u root -H -s eval 'echo $SHELL - $USER - $HOME - $PWD'
什么 shell 是否调用由“SHELL 环境变量(如果已设置)或在 passwd(5) 中指定的 shell”确定(根据
man sudo
)。请注意,使用
-s
重要的是调用用户的环境,而对于
-i
它是模拟用户的。
-i
或 -s
) :
sudo
在 Linux 上显然只接受可执行文件或内置名称作为 -s
之后的第一个参数。/-i
,而 OSX 允许传递整个 shell 命令行;例如,OSX 接受 sudo -u root -s 'echo $SHELL - $USER - $HOME - $PWD'
直接(不需要 eval
),而 Linux 不需要(从 sudo 1.8.95p
开始)。sudo
的旧版本在 Linux 上不要对传递给 shell 的参数应用 shell 扩展 ;例如,使用 sudo 1.8.3p1
(例如,Ubuntu 12.04),sudo -u root -H -s echo '$HOME'
简单地回显字符串文字“$HOME”,而不是在 root 用户的上下文中扩展变量引用。截至至少 sudo 1.8.9p5
(例如,Ubuntu 14.04)这已被修复。因此,即使使用较旧的 sudo
也能确保在 Linux 上进行扩展版本,将整个命令作为单个参数传递给 eval
;例如:sudo -u root -H -s eval 'echo $HOME'
. (虽然在 OSX 上不是必需的,但这也适用于那里。)root
用户的$SHELL
变量包含 /bin/sh
在 OSX 10.9 上,它是 /bin/bash
在 Ubuntu 12.04 上。SUDO_COMMAND
,
SUDO_USER
,
SUDO_UID=
,
SUDO_GID
.
man sudo
和
man sudoers
更多的细节。
关于bash - 如何在bash脚本中获取不同用户的$HOME目录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20504662/
我用 IntelliJ IDEA 2021.1 CE 在 流行!_OS 20.04 与 bash 5.0.17 . 问题造句:我将IntelliJ终端设置为/bin/bash通过 IntelliJ 设
给定如下命令: bash --shortcuts 我想显示一个快捷方式列表,就像在这个页面上一样: http://www.skorks.com/2009/09/bash-shortcuts-for-m
我有一个脚本可以操作数据、创建参数并将它们发送到第二个脚本。其中一个参数包含一个空格。 脚本1.sh: args=() args+=("A") args+=("1 2") args+=("B") .
我的脚本的“只运行一次”版本的一个非常简单的示例: ./myscript.sh var1 "var2 with spaces" var3 #!/bin/bash echo $1 #output: va
我想了解数字( double )在 bash 中是如何表示的,以及当我在 bash 中以十六进制格式打印数字时会发生什么。 根据 IEEE 754 标准,double 应由 64 位表示:52 位(1
我试图在 bash -c "..." 命令中获取 bash 脚本,但它不起作用。 如果我在 bash -c "..." 之外运行命令,它会起作用。 我需要使用 bash -c "..." 因为我想确保
如何检测我的 bash shell 中是否加载了 bash 补全包?从 bash-completion 的 2.1 版(包含在 Debian 8 中)开始,除了 BASH_COMPLETION_COM
我的 bash_profile 中有一个投影函数。现在我试图从 bash 脚本中调用这个函数,但是我得到了一个未找到的错误。如何使投影函数对 bash 脚本可见? 最佳答案 必须导出函数 export
我正在编写一个 bash 脚本,它接受许多命令行参数(可能包括空格)并通过登录 shell 将它们全部传递给程序 (/bin/some_program)。从 bash 脚本调用的登录 shell 将取
当我创建一个新的 bash 进程时,提示符默认为一个非常简单的提示符。我知道我可以编辑 .bashrc 等来更改它,但是有没有办法使用 bash 命令传递提示? 谢谢! 最佳答案 提示由 PS1、PS
好的,我希望这个问题有一定道理,但是 bash shell 和 bash 终端之间有什么区别?例子。当我第一次打开终端时,会提示我当前的目录和用户名。在终端窗口标题中显示 -bash- ,当我键入 e
我是 SBCL 的新手,我正在尝试从 bash 终端运行存储在文本文件中的 Lisp 脚本。 这是我在文件开头写的内容 http://www.sbcl.org/manual/#Running-from
我知道我们可以在 bash 中使用将十六进制转换为十进制 #!/bin/bash echo "Type a hex number" read hexNum echo $(( 16#$hexNum ))
我正在尝试在 bash 脚本中自动完成文件夹名称。如果我输入完整的文件夹名称,一切正常,但我不知道如何自动完成名称。有什么想法吗? repo() { cd ~/Desktop/_REPOS/$1 }
我想检查远程网站上的一些文件。 这里是bash命令生成计算文件md5的命令 [root]# head -n 3 zrcpathAll | awk '{print $3}' | xargs -I {}
是否有任何内置函数可以使用 bash shell 脚本从给定日期获取下周日(下周一、下周二等)?例如,2014 年 9 月 1 日之后的第一个星期日是什么时候?我预计 2014 年 9 月 7 日。
我一直在尝试根据表格重命名一些特定文件,但没有成功。它要么重命名所有文件,要么给出错误。 该目录包含数百个以长条形码命名的文件,我只想重命名包含模式 _1_ 的文件。 例子 barcode_1_bar
bash 中有没有办法用变量的内容替换文本文件中的占位符? 例如,我想发送一封电子邮件通知,如下所示: Dear Foo, Alert: blah blah blah blah blah blah
我有一个 bash 脚本,它在某些字符串上附加了一个重音字符,导致它失败,我找不到这些字符在哪里或如何进入那里。 这是一些示例输出: mv: cannot move â/tmp/myapp.zipâ
这个问题在这里已经有了答案: How do I place stdout on edit line? (1 个回答) Can a bash script prepopulate the prompt
我是一名优秀的程序员,十分优秀!