如何在bash脚本启动的Ubuntu(含SSH场景)中执行bash脚本命令
问题1:在bash脚本启动的Ubuntu系统中执行命令
这个场景分两种常见情况,我分别给你讲具体的实现方式:
非交互式启动+一次性执行命令
如果你的脚本是启动Ubuntu来完成某个一次性任务(比如容器、chroot环境),直接在启动命令后通过bash -c指定要执行的命令即可:
- 比如用Docker启动Ubuntu容器并执行更新:
# 脚本内容示例 docker run ubuntu:latest bash -c "apt update && apt upgrade -y && echo 'Update completed'" - 如果是chroot到Ubuntu根文件系统执行命令:
# 假设Ubuntu根目录挂载在/ubuntu_chroot chroot /ubuntu_chroot bash -c "useradd newuser && passwd newuser"
启动交互式环境后自动执行命令
如果需要启动Ubuntu的交互式shell,同时自动执行一些初始化命令(执行完保持交互状态),可以用这两种方法:
- 用
exec bash在命令执行后启动交互式shell:docker run -it ubuntu:latest bash -c "echo 'Welcome to Ubuntu!' && apt update -y && exec bash" - 用Heredoc传递多行命令,灵活性更高:
# 脚本里启动交互式Ubuntu并执行初始化操作 docker run -it ubuntu:latest bash << EOF echo "Setting up environment..." apt install -y curl wget echo "Setup done! You can start working now." exec bash # 保持交互式会话 EOF
问题2:SSH远程访问时,让命令/脚本在远程Ubuntu环境内执行
你提到的“命令在退出SSH后才执行”,应该是把命令写在了ssh命令的外面(属于本地执行),而非ssh的参数里。这里给你几种正确的远程执行方法:
直接追加命令到ssh后(适合短命令)
ssh命令后面直接跟要执行的命令,这个命令会在远程Ubuntu上执行,执行完成后会话自动退出:
# 远程执行查看磁盘空间的命令 ssh user@remote-ubuntu "df -h"
如果命令包含特殊字符(比如变量、管道),用单引号包裹,避免本地shell解析:
# 远程统计当前登录用户数,单引号防止$()在本地展开 ssh user@remote-ubuntu 'who | wc -l'
传递本地脚本到远程执行
如果有一个本地的bash脚本(比如remote_script.sh),不需要上传到远程,直接通过标准输入传给远程的bash即可:
# 本地脚本在远程Ubuntu上运行 ssh user@remote-ubuntu bash -s < ./remote_script.sh
用Heredoc写多行远程命令
不想单独创建脚本文件的话,直接在ssh命令里用Heredoc写多行命令,所有内容都会在远程执行:
ssh user@remote-ubuntu bash << EOF echo "Starting remote task..." mkdir -p ~/workspace cd ~/workspace wget https://example.com/file.tar.gz tar -xzf file.tar.gz echo "Task finished!" EOF
登录交互式shell后自动执行脚本
如果需要先进入远程交互式shell,同时自动执行脚本(执行完不退出),可以这样写:
ssh user@remote-ubuntu "bash -c '~/my_init_script.sh; exec bash'"
这样脚本执行完成后,会保留交互式bash会话供你操作。
内容的提问来源于stack exchange,提问作者president




