You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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

火山引擎 最新活动