运行 脚本与具有 shell 的用户完全一样
run script exactly like a user with a shell
当我编写 cronjob、服务脚本或守护命令时,我经常让它们调用 bash 脚本或 运行 bash 命令。问题是这些命令的执行行为与我在登录 shell 中 运行 它们时的行为不同。差异归结为环境变量和许多其他我不理解的登录方式和 shells 工作的微妙之处。
有没有一种方法可以 运行 bash 命令并让它们的行为与我登录并 运行 它们时的行为完全一样。我需要一个万无一失的过程,我可以在其中设置一个脚本到 运行 一个 bash 命令,它可以在这些情况下理想地工作:
- 在 cronjob 中调用
- 在服务(init.d/systemd)脚本中调用
- 运行 作为后台进程(比如使用 & 和 nohup)
-可配置的标准错误和标准输出重定向
- 可配置的用户
例如,通常 运行ning: su -c 'nohup $MY_CMD > /var/log/out.txt 2>&1 &' $MY_USER
会导致应用程序出错,而不是 shell 命令本身,因为应用程序会处理在 [=41= 中执行的命令] 和非 shell 不同。如何让应用程序认为它是通过登录 shell 调用的?
虽然这种方法当然不是面向生产的,也不安全,但我经常发现自己在最后一刻的情况下,我必须在后台自动获取 运行 命令(并且只需要一个小时来计算它out) 作为某个用户并且命令本身只有在我 运行 在我的 shell.
中手动执行时才有效
我还想避免使用通过 ssh 连接传递命令,或完全避免调用 ssh 连接。 ssh $USER@127.0.0.1 '$CMD'
之类的东西需要我将 ssh 密钥加载到机器上,而我宁愿避免这样做。不确定这是否重要,但我的主要目标平台是 Centos 6(想要一个适用于所有 *nix 的通用解决方案)。
如果我还可以捕获脚本生成的所有进程的 PID,那么我可以加分,这样我以后可以自动杀死它们。
查看 runuser 命令,您可以在初始化脚本等中使用它。
您也可以在 crons 中使用它。
/sbin/runuser "$USER" -s /bin/sh -c "cd $BASEDIR && exec $CMD start > $STDOUTLOG 2> $STDERRLOG &"
您也应该能够获取任何命令的 PID.. 或者让您的进程为您编写一个 PID 文件并对其进行 cat($$
是 shell var从您的任何 shell 进程中回显”
确保调用进程设置了 SSH 密钥(以免要求输入密码),然后执行
echo /path/to/some/command | ssh -t -t someuser@localhost
来自 ssh 手册页:
-t Force pseudo-tty allocation. This can be used to execute arbi‐
trary screen-based programs on a remote machine, which can be
very useful, e.g. when implementing menu services. Multiple -t
options force tty allocation, even if ssh has no local tty.
当我编写 cronjob、服务脚本或守护命令时,我经常让它们调用 bash 脚本或 运行 bash 命令。问题是这些命令的执行行为与我在登录 shell 中 运行 它们时的行为不同。差异归结为环境变量和许多其他我不理解的登录方式和 shells 工作的微妙之处。
有没有一种方法可以 运行 bash 命令并让它们的行为与我登录并 运行 它们时的行为完全一样。我需要一个万无一失的过程,我可以在其中设置一个脚本到 运行 一个 bash 命令,它可以在这些情况下理想地工作:
- 在 cronjob 中调用
- 在服务(init.d/systemd)脚本中调用
- 运行 作为后台进程(比如使用 & 和 nohup) -可配置的标准错误和标准输出重定向
- 可配置的用户
例如,通常 运行ning: su -c 'nohup $MY_CMD > /var/log/out.txt 2>&1 &' $MY_USER
会导致应用程序出错,而不是 shell 命令本身,因为应用程序会处理在 [=41= 中执行的命令] 和非 shell 不同。如何让应用程序认为它是通过登录 shell 调用的?
虽然这种方法当然不是面向生产的,也不安全,但我经常发现自己在最后一刻的情况下,我必须在后台自动获取 运行 命令(并且只需要一个小时来计算它out) 作为某个用户并且命令本身只有在我 运行 在我的 shell.
中手动执行时才有效我还想避免使用通过 ssh 连接传递命令,或完全避免调用 ssh 连接。 ssh $USER@127.0.0.1 '$CMD'
之类的东西需要我将 ssh 密钥加载到机器上,而我宁愿避免这样做。不确定这是否重要,但我的主要目标平台是 Centos 6(想要一个适用于所有 *nix 的通用解决方案)。
如果我还可以捕获脚本生成的所有进程的 PID,那么我可以加分,这样我以后可以自动杀死它们。
查看 runuser 命令,您可以在初始化脚本等中使用它。
您也可以在 crons 中使用它。
/sbin/runuser "$USER" -s /bin/sh -c "cd $BASEDIR && exec $CMD start > $STDOUTLOG 2> $STDERRLOG &"
您也应该能够获取任何命令的 PID.. 或者让您的进程为您编写一个 PID 文件并对其进行 cat($$
是 shell var从您的任何 shell 进程中回显”
确保调用进程设置了 SSH 密钥(以免要求输入密码),然后执行
echo /path/to/some/command | ssh -t -t someuser@localhost
来自 ssh 手册页:
-t Force pseudo-tty allocation. This can be used to execute arbi‐
trary screen-based programs on a remote machine, which can be
very useful, e.g. when implementing menu services. Multiple -t
options force tty allocation, even if ssh has no local tty.