语境:

语境:

尝试在 ubuntu 14.04 上使用“lfs”用户执行源命令并得到:

root@linux:~/lfs# su lfs - -c "source ~/.bash_profile"
bash: cannot set terminal process group (-1): Inappropriate ioctl for device
bash: no job control in this shell

有任何想法吗?

背景信息:我正在关注 LFS 书,用它制作一个脚本,所以在我用 sudo 执行的脚本中,当它到达这部分时,在创建 lfs 用户及其 .bashrc 和 .bashprofile 之后,我猜它是正在加载它。

语境:

echo "info: create 'lfs' group and user..."
groupadd -f lfs
id -u lfs &>/dev/null || useradd -s /bin/bash -g lfs -m -k /dev/null lfs
passwd -d -q lfs

echo "info: make 'lfs' own the 'tools' and 'sources' directories..."
chown lfs $LFS/tools
chown lfs $LFS/sources

echo "info: creating a clean '.bash_profile' as user 'lfs'..."
su lfs - -c "cat > ~/.bash_profile << \"EOF\"
exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash
EOF"

echo "info: creating a clean '.bashrc' as user 'lfs'..."
su lfs - -c "cat > ~/.bashrc << \"EOF\"
set +h
umask 022
LFS=/mnt/lfs
LC_ALL=POSIX
LFS_TGT=$(uname -m)-lfs-linux-gnu
PATH=/tools/bin:/bin:/usr/bin
export LFS LC_ALL LFS_TGT PATH
EOF"

su lfs - -c "source ~/.bash_profile"

编辑:

有人建议我的语法不正确,我现在不在我的 Linux 机器上,所以当我有机会时会尝试使用不同的语法。然而,作为信息,我从这里的答案中得到了语法: https://serverfault.com/questions/411307/cannot-set-terminal-process-group-during-su-to-another-user-as-login-shell

答案1

  • su - usernameusername作为交互式 shell运行登录 shell 。

  • su username command arguments运行command arguments 非交互地账户下username

你命令su lfs - -c "source ~/.bash_profile"意味着- -c "source ~/.bash_profile"以用户身份运行lfs 非交互地。现在 shell 看到该选项-并说,我要作为交互式登录 shell 运行,并尝试初始化终端,但su已断开子进程与控制终端的连接。

简而言之:-要么放错了地方,要么是错误的。

对于更长的讨论,请参阅同样的问题在服务器故障上。

答案2

在 docker 容器内切换用户时,我遇到了同样的问题。我通过添加修复了它--pty (-P)为会话创建伪终端并避免 TIOCSTI ioctl 终端注入的选项。因此以下命令应该可以解决该问题:

su lfs -l -P -c ...

相关内容