Ну, это неловко. Как только я сформулировал вопросы, решение стало проясняться. Конечно, можно создать оболочку bash и выполнять там любые команды, которые я захочу,
spawn /bin/bash
send "/usr/bin/sftp \"$uri\" <<< $\'put \"$source\"\'\r"
В любом случае, как бы то ни было, с этой проблемой может столкнуться больше людей, поэтому я опубликую решение этой проблемы, а не удалю пост.