Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
bash-一个复杂的脚本_Bash_Shell - Fatal编程技术网

bash-一个复杂的脚本

bash-一个复杂的脚本,bash,shell,Bash,Shell,我希望在重新启动时在屏幕环境中执行一系列命令。 我可以通过我的crontab执行此操作: @reboot /usr/bin/screen -d -m -S myPseudoDaemon /path/to/something.sh …所以我可以把命令放在'something.sh'中。使这种情况复杂化的是,这一系列命令包括一个sudo和一个chroot: sudo -i # become root chroot /opt/debianUnstable # enter the chroot-ed

我希望在重新启动时在屏幕环境中执行一系列命令。 我可以通过我的crontab执行此操作:

@reboot /usr/bin/screen -d -m -S myPseudoDaemon /path/to/something.sh
…所以我可以把命令放在'something.sh'中。使这种情况复杂化的是,这一系列命令包括一个sudo和一个chroot:

sudo -i # become root
chroot /opt/debianUnstable # enter the chroot-ed Debian unstable
/bin/bash # source my bash setting, including mandatory env vars
/path/to/whatever.sh # the actual "daemon"

你知道我该怎么做吗?

当你执行chroot时,你会有一个交互式的shell或者运行带有特殊根目录的命令,这意味着你的根已经在新的根目录中了

首先在新根目录中执行shell

chroot [OPTION] NEWROOT /bin/bash --login

通过bash手册页,我们知道当bash作为交互式登录shell调用时,或者作为带有--login选项的非交互式shell调用时,它首先读取并执行文件/etc/profile中的命令(如果该文件存在)。读取该文件后,它将按顺序查找~/.bash_profile、~/.bash_login和~/.profile,并从第一个存在且可读的文件读取和执行命令。因此,您可能会将/path/to/whatever.sh添加到相对于新根目录的概要脚本中。

当您执行chroot时,您将有一个交互式shell或运行带有特殊根目录的命令,这意味着您的根目录已经在新根目录中

首先在新根目录中执行shell

chroot [OPTION] NEWROOT /bin/bash --login

通过bash手册页,我们知道当bash作为交互式登录shell调用时,或者作为带有--login选项的非交互式shell调用时,它首先读取并执行文件/etc/profile中的命令(如果该文件存在)。读取该文件后,它将按顺序查找~/.bash_profile、~/.bash_login和~/.profile,并从第一个存在且可读的文件读取和执行命令。因此,您可能需要将/path/to/whatever.sh添加到与新根相关的概要脚本中。

您的/bin/bash正在创建一个shell。你应该写:-

/bin/bash /path/to/whatever.sh # the actual "daemon"

您的/bin/bash正在创建一个shell。你应该写:-

/bin/bash /path/to/whatever.sh # the actual "daemon"

您是否尝试在根crontab中安排它

它将允许您无需密码即可启动

要使用应用程序用户运行命令,可以使用:

su -u <user> -c <command>
su-u-c

您是否尝试在根crontab中安排它

它将允许您无需密码即可启动

要使用应用程序用户运行命令,可以使用:

su -u <user> -c <command>
su-u-c

最后,我使用jcb00s和Teg提供的建议解决了这个问题-但由于我需要环境的特定部分,我将它放在了一个在chroot中执行的脚本中:

@reboot /usr/bin/screen -d -m -S autoLoginScreen /root/chrootPollAndBuildWithUnstable.sh
Inside/root/chrootPollAndBuildWithUnstable.sh:

# cat /root/chrootPollAndBuildWithUnstable.sh
chroot /opt/debianUnstable/ /pollAndBuildInsideChroot.sh
在chroot-ed-debian不稳定文件系统中,我执行最后一步

# cat /opt/debianUnstable/pollAndBuildInsideChroot.sh 
su - <user> -c '/bin/bash /home/user/work/builder.sh'
#cat/opt/debiannstable/pollAndBuildInsideChroot.sh
su--c'/bin/bash/home/user/work/builder.sh'

…在构建器脚本设置环境并继续构建的地方。

最后,我使用jcb00s和Teg的建议解决了这个问题-但由于我需要环境的特定部分,我将它放在了一个在chroot中执行的脚本中:

@reboot /usr/bin/screen -d -m -S autoLoginScreen /root/chrootPollAndBuildWithUnstable.sh
Inside/root/chrootPollAndBuildWithUnstable.sh:

# cat /root/chrootPollAndBuildWithUnstable.sh
chroot /opt/debianUnstable/ /pollAndBuildInsideChroot.sh
在chroot-ed-debian不稳定文件系统中,我执行最后一步

# cat /opt/debianUnstable/pollAndBuildInsideChroot.sh 
su - <user> -c '/bin/bash /home/user/work/builder.sh'
#cat/opt/debiannstable/pollAndBuildInsideChroot.sh
su--c'/bin/bash/home/user/work/builder.sh'

…生成器脚本在其中设置环境并继续生成。

将您自己添加到
sudoers
列表中。@devnull:已经完成了-无密码sudo工作,但会打开根shell并在那里等待。我想运行其中的其余命令…将您自己添加到
sudoers
列表中。@devnull:已经完成了-无密码sudo可以工作,但会打开根shell并在那里等待。我想运行它里面的其余命令…如果我这样做,我的.bashrc/.profile里面的env变量就不会被设置。我首先运行/bin/bash以获得我的“默认”配置文件。这一点很好。您可以“源”文件。如果这样做,则不会设置.bashrc/.profile中的环境变量。我首先运行/bin/bash以获得我的“默认”配置文件。这一点很好。您可以“源”文件。谢谢,你的建议是最接近解决方案的。但如果我这样做,用户将无法正常登录-他将始终执行脚本。。。有没有一种方法可以同时实现--login效果(读取配置文件)和运行我的脚本?谢谢,您的建议是最接近解决方案的。但如果我这样做,用户将无法正常登录-他将始终执行脚本。。。有没有一种方法既可以实现--login效果(读取配置文件)又可以运行我的脚本?